Kotlin Apprentice tutorial

I’ve written a companion function which convert an index into a date that is itself an enumeration. When I try and test it out Monday doesn’t get printed out conversely when debugging, the debugger indicates that it has jumped to the line and should print out Monday.

The code that follows contains the companion class.

enum class DayOfTheWeek(val isWeekend: Boolean = false) {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday(true),
    Sunday(true);

    fun daysUntil(other: DayOfTheWeek) : Int {
        if( this.ordinal < other.ordinal ) { // 1
            return other.ordinal - this.ordinal // 2
        } else {
            return other.ordinal - this.ordinal + DayOfTheWeek.values().count() // 3
        }
    }

    companion object {
        fun convertFromInt(index: Int): DayOfTheWeek? {
            var count = 0
            var currentDay: String = ""
            var enumVal : DayOfTheWeek = Monday
            if ( index <= 0 ) {
                for( day in DayOfTheWeek.values() ) {
                    if( index == count) {
                        currentDay = day.name
                        break
                    }
                    count += 1
                }
            } else {
                return null
            }
            when( currentDay) {
                "Monday" -> enumVal = Monday
                "Tuesday" -> enumVal = Tuesday
                "Wednesday" -> enumVal = Wednesday
                "Thursday" -> enumVal = Thursday
                "Friday" -> enumVal = Friday
                "Saturday" -> enumVal = Saturday
                "Sunday" -> enumVal = Sunday
                else -> println("I don't recognize the day given")
            }
            return enumVal
        }

        fun today(): DayOfTheWeek {
            // 1
            val calendarDayOfTheWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
            // 2
            var adjustedDay = calendarDayOfTheWeek - 2
            // 3
            val days = DayOfTheWeek.values()
            if( adjustedDay < 0) {
                adjustedDay += days.count()
            }
            // 4
            val today = days.first { it.ordinal == adjustedDay }
            return today
        }
    }
}

The code that follows goes in main.

    val day = 0
when(DayOfTheWeek.convertFromInt(day)) {
        DayOfTheWeek.Monday -> println("Monday")
        DayOfTheWeek.Tuesday -> println("Tuesday")
        DayOfTheWeek.Wednesday -> println("Wednesday")
        DayOfTheWeek.Thursday -> println("Thursday")
        DayOfTheWeek.Saturday -> println("Saturday")
        DayOfTheWeek.Sunday -> println("Sunday")
        else -> println("I don't recognize day")
    }

Hmm… do you try to reinvent: DayOfTheWeek.values().getOrNull(index)? You have critical bugs in this function, it can only return Monday or null and it returns Monday even for negative numbers.

Also, if you didn’t notice, Java stdlib has DayOfWeek class already.

Sorry it wa really rubbish code and I thought I knew what I was doing

I think we can all identify with that… :blush: