Coverage Summary for Class: BeatsPerMinute (com.vsevolodganin.clicktrack.model)

Class Method, % Branch, % Line, % Instruction, %
BeatsPerMinute 0% (0/8) 0% (0/14) 0% (0/14) 0% (0/151)
BeatsPerMinute$Companion 0% (0/3) 0% (0/3) 0% (0/3)
Total 0% (0/11) 0% (0/14) 0% (0/17) 0% (0/154)


 package com.vsevolodganin.clicktrack.model
 
 import kotlinx.serialization.Serializable
 import kotlin.math.roundToInt
 import kotlin.time.Duration
 import kotlin.time.Duration.Companion.minutes
 
 @Serializable
 data class BeatsPerMinute(val value: Int) : Comparable<BeatsPerMinute> {
     companion object {
         val VALID_TEMPO_RANGE = 1..999
         val MAX = VALID_TEMPO_RANGE.last.bpm
         val MIN = VALID_TEMPO_RANGE.first.bpm
     }
 
     init {
         require(value in VALID_TEMPO_RANGE) {
             "Bpm should be in range [${VALID_TEMPO_RANGE.first}, $${VALID_TEMPO_RANGE.last}] but was: $value"
         }
     }
 
     override fun compareTo(other: BeatsPerMinute): Int = value.compareTo(other.value)
 
     operator fun plus(o: BeatsPerMinute): BeatsPerMinute = (value + o.value).bpm
 
     operator fun minus(o: BeatsPerMinute): BeatsPerMinute = (value - o.value).bpm
 
     operator fun plus(o: BeatsPerMinuteOffset): BeatsPerMinute = (value + o.value).bpm
 
     operator fun minus(o: BeatsPerMinuteOffset): BeatsPerMinute = (value - o.value).bpm
 }
 
 fun BeatsPerMinute(beatCount: Int, timelapse: Duration): BeatsPerMinute {
     return (1.minutes / timelapse * beatCount).roundToInt().bpm
 }
 
 val Int.bpm: BeatsPerMinute get() = BeatsPerMinute(coerceIn(BeatsPerMinute.VALID_TEMPO_RANGE))
 
 val BeatsPerMinute.interval: Duration get() = 1.minutes / value