From a73913bdb44185c2ba36cde394b65c0d21385ca8 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Mon, 16 Aug 2021 04:22:00 +0500 Subject: [PATCH] Add class ArticleId --- .../main/java/com/causa_arcana/ArticleId.kt | 36 +++++++++++++++++++ .../java/com/causa_arcana/ExampleUnitTest.kt | 19 ++++++---- 2 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/causa_arcana/ArticleId.kt diff --git a/app/src/main/java/com/causa_arcana/ArticleId.kt b/app/src/main/java/com/causa_arcana/ArticleId.kt new file mode 100644 index 0000000..ea97ac9 --- /dev/null +++ b/app/src/main/java/com/causa_arcana/ArticleId.kt @@ -0,0 +1,36 @@ +package com.causa_arcana + +import java.lang.RuntimeException + +class ArticleId(val year: UInt, val month: UInt, val day: UInt, val slug: String) { + init { + if (year !in 2000u..3000u) throw RuntimeException("Invalid article year") + if (month !in 1u..12u) throw RuntimeException("Invalid article month") + if (day !in 1u..31u) throw RuntimeException("Invalid article day") + if (!SLUG_RE.matches(slug)) throw RuntimeException("Invalid article slug") + } + + override fun toString(): String { + return "${yearPadded()}-${monthPadded()}-${dayPadded()}-$slug" + } + + private fun yearPadded(): String = year .toString().padStart(4, '0') + private fun monthPadded(): String = month.toString().padStart(2, '0') + private fun dayPadded(): String = day .toString().padStart(2, '0') + + companion object { + private val ID_RE = """^(\d{4})-(\d\d)-(\d\d)-([a-z0-9]+)(-[a-z0-9]+)*$""".toRegex() + private val SLUG_RE = """^([a-z0-9]+)(-[a-z0-9]+)*$""".toRegex() + + fun fromString(id: String): ArticleId { + (ID_RE.matchEntire(id) ?: throw RuntimeException("Invalid article ID")).destructured + .let { (year, month, day, slugHead, slugTail) -> return ArticleId( + year.toUInt(), + month.toUInt(), + day.toUInt(), + slugHead + slugTail, + ) + } + } + } +} diff --git a/app/src/test/java/com/causa_arcana/ExampleUnitTest.kt b/app/src/test/java/com/causa_arcana/ExampleUnitTest.kt index 3f35258..fff191b 100644 --- a/app/src/test/java/com/causa_arcana/ExampleUnitTest.kt +++ b/app/src/test/java/com/causa_arcana/ExampleUnitTest.kt @@ -4,14 +4,19 @@ import org.junit.Test import org.junit.Assert.* -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ class ExampleUnitTest { @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) + fun articleIdFromString() { + val articleId = ArticleId.fromString("2021-01-01-hello-world") + assertEquals(2021u, articleId.year) + assertEquals(1u, articleId.month) + assertEquals(1u, articleId.day) + assertEquals("hello-world", articleId.slug) + } + + @Test + fun articleIdToString() { + val articleId = ArticleId(2021u, 1u, 1u, "hello-world") + assertEquals("2021-01-01-hello-world", articleId.toString()) } }