From cbc69be517b41846f13df8a80585d989a87856b3 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 14 Feb 2022 22:39:24 -0800 Subject: [PATCH] Code cleanup and added test. --- .../net/thauvin/erik/mobibot/commands/Info.kt | 45 +++++++++++++++- .../thauvin/erik/mobibot/commands/InfoTest.kt | 51 +++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 src/test/kotlin/net/thauvin/erik/mobibot/commands/InfoTest.kt diff --git a/src/main/kotlin/net/thauvin/erik/mobibot/commands/Info.kt b/src/main/kotlin/net/thauvin/erik/mobibot/commands/Info.kt index 27521ef..d176448 100644 --- a/src/main/kotlin/net/thauvin/erik/mobibot/commands/Info.kt +++ b/src/main/kotlin/net/thauvin/erik/mobibot/commands/Info.kt @@ -36,13 +36,15 @@ import net.thauvin.erik.mobibot.Utils.capitalise import net.thauvin.erik.mobibot.Utils.green import net.thauvin.erik.mobibot.Utils.helpFormat import net.thauvin.erik.mobibot.Utils.isChannelOp +import net.thauvin.erik.mobibot.Utils.plural import net.thauvin.erik.mobibot.Utils.sendList import net.thauvin.erik.mobibot.Utils.sendMessage -import net.thauvin.erik.mobibot.Utils.uptime import net.thauvin.erik.mobibot.commands.links.LinksMgr import net.thauvin.erik.mobibot.commands.tell.Tell import org.pircbotx.hooks.types.GenericMessageEvent import java.lang.management.ManagementFactory +import kotlin.time.DurationUnit +import kotlin.time.toDuration class Info(private val tell: Tell) : AbstractCommand() { private val allVersions = listOf( @@ -55,11 +57,50 @@ class Info(private val tell: Tell) : AbstractCommand() { override val isPublic = true override val isVisible = true + companion object { + /** + * Converts milliseconds to year month week day hour and minutes. + */ + @JvmStatic + fun Long.toUptime(): String { + this.toDuration(DurationUnit.MILLISECONDS).toComponents { wholeDays, hours, minutes, _, _ -> + val years = wholeDays / 365 + var days = wholeDays % 365 + val months = days / 30 + days %= 30 + val weeks = days / 7 + days %= 7 + + with(StringBuffer()) { + if (years > 0) { + append(years).append(" year".plural(years)).append(' ') + } + if (months > 0) { + append(weeks).append(" month".plural(months)).append(' ') + } + if (weeks > 0) { + append(weeks).append(" week".plural(weeks)).append(' ') + } + if (days > 0) { + append(days).append(" day".plural(days)).append(' ') + } + if (hours > 0) { + append(hours).append(" hour".plural(hours.toLong())).append(' ') + } + + append(minutes).append(" minute".plural(minutes.toLong())) + + return toString() + } + } + } + } + override fun commandResponse(channel: String, args: String, event: GenericMessageEvent) { event.sendList(allVersions, 1) val info = StringBuilder() info.append("Uptime: ") - .append(uptime(ManagementFactory.getRuntimeMXBean().uptime)) + .append(ManagementFactory.getRuntimeMXBean().uptime.toUptime()) .append(" [Entries: ") .append(LinksMgr.entries.links.size) if (isChannelOp(channel, event)) { diff --git a/src/test/kotlin/net/thauvin/erik/mobibot/commands/InfoTest.kt b/src/test/kotlin/net/thauvin/erik/mobibot/commands/InfoTest.kt new file mode 100644 index 0000000..f2036da --- /dev/null +++ b/src/test/kotlin/net/thauvin/erik/mobibot/commands/InfoTest.kt @@ -0,0 +1,51 @@ +/* + * InfoTest.kt + * + * Copyright (c) 2004-2022, Erik C. Thauvin (erik@thauvin.net) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of this project nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.thauvin.erik.mobibot.commands + +import assertk.assertThat +import assertk.assertions.isEqualTo +import net.thauvin.erik.mobibot.commands.Info.Companion.toUptime +import org.testng.annotations.Test + +class InfoTest { + @Test + fun testToUptime() { + assertThat(547800300076L.toUptime(), "full").isEqualTo("17 years 2 months 2 weeks 1 day 6 hours 45 minutes") + assertThat(24300000L.toUptime(), "hours minutes").isEqualTo("6 hours 45 minutes") + assertThat(110700000L.toUptime(), "days hours minutes").isEqualTo("1 day 6 hours 45 minutes") + assertThat(1320300000L.toUptime(), "weeks days hours minutes").isEqualTo("2 weeks 1 day 6 hours 45 minutes") + assertThat(2700000L.toUptime(), "45 minutes").isEqualTo("45 minutes") + assertThat(60000L.toUptime(), "1 minute").isEqualTo("1 minute") + assertThat(0L.toUptime(), "0 minute").isEqualTo("0 minute") + } +}