From db6f93edb23e846f85acb87d2f614a0669d80bc5 Mon Sep 17 00:00:00 2001 From: dadachi Date: Fri, 1 May 2026 14:15:32 +0900 Subject: [PATCH] Clean up legacy Number Tag/NFC artifacts and tighten utilities - Remove leftover terminology and dead code from the previous "Number Tag" / NFC / QR-image feature set: README copy, NATA-3xxx error code row in CLAUDE.md, and the unused FileProvider declaration plus its filepaths.xml resource. - Tighten validation messaging and small utilities: clarify item tag validation error messages, drop unused card date/time string overloads (production only uses String.cardDateTimeString), and rename validateEmail -> isValidEmail to match the is* boolean-predicate convention. Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 1 - README.md | 4 +- app/src/main/AndroidManifest.xml | 9 -- .../ui/app_root/ForgotPasswordViewModel.kt | 4 +- ...ResendConfirmationInstructionsViewModel.kt | 4 +- .../SignInEmailAndPasswordViewModel.kt | 4 +- .../ui/app_root/SignUpViewModel.kt | 4 +- .../ui/settings/ShopkeeperEditViewModel.kt | 4 +- .../utils/DateUtility.kt | 32 +----- .../nativeapptemplatefree/utils/Utility.kt | 2 +- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/filepaths.xml | 4 - .../app_root/ForgotPasswordViewModelTest.kt | 2 +- ...ndConfirmationInstructionsViewModelTest.kt | 2 +- .../SignInEmailAndPasswordViewModelTest.kt | 2 +- .../ui/app_root/SignUpViewModelTest.kt | 2 +- .../settings/ShopkeeperEditViewModelTest.kt | 2 +- .../utils/DateUtilityTest.kt | 97 ++----------------- .../utils/UtilityTest.kt | 20 ++-- 19 files changed, 40 insertions(+), 163 deletions(-) delete mode 100644 app/src/main/res/xml/filepaths.xml diff --git a/CLAUDE.md b/CLAUDE.md index 4ddb11a..bc95dc6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,7 +55,6 @@ All errors should use the `CodedError` interface. Error codes use the `NATA-XXXX |-------|------|-------------| | NATA-1xxx | App/general errors | Unexpected errors, catch-all | | NATA-2xxx | API/network errors | HTTP request failures, parsing errors | -| NATA-3xxx | NFC/scan errors | NFC tag read/write/scan failures | - New error types must implement `CodedError` - Use `codedDescription` (not `message` or `localizedMessage`) in all user-facing error messages — this prepends `[NATA-XXXX]` for `CodedError` types diff --git a/README.md b/README.md index 04b3bc9..0f745b1 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,10 @@ NativeAppTemplate-Free-Android uses modern Android development tools and practic - Email Confirmation - Forgot Password - CRUD Operations for Shops (Create/Read/Update/Delete) -- CRUD Operations for Shops' Nested Resource, Number Tags (ItemTags) (Create/Read/Update/Delete) +- CRUD Operations for Shops' Nested Resource, Item Tags (Create/Read/Update/Delete) - Force App Version Update - Force Privacy Policy Version Update - Force Terms of Use Version Update -- Generate QR Code Image for Number Tags (ItemTags) with a Centered Number -- NFC features for Number Tags (ItemTags): Write Application Info to a Tag, Read a Tag, Background Tag Reading - And more! ## NFC Tag Operations diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 65f7a0d..c7b61da 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,14 +26,5 @@ - - - diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModel.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModel.kt index 1efef57..96547a6 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModel.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModel.kt @@ -6,7 +6,7 @@ import com.nativeapptemplate.nativeapptemplatefree.NatConstants import com.nativeapptemplate.nativeapptemplatefree.common.errors.codedDescription import com.nativeapptemplate.nativeapptemplatefree.data.login.SignUpRepository import com.nativeapptemplate.nativeapptemplatefree.model.SendResetPassword -import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.validateEmail +import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.isValidEmail import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -75,7 +75,7 @@ class ForgotPasswordViewModel @Inject constructor( fun hasInvalidDataEmail(): Boolean { if (uiState.value.email.isBlank()) return true - return !uiState.value.email.validateEmail() + return !uiState.value.email.isValidEmail() } fun updateEmail(newEmail: String) { diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModel.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModel.kt index 020ac31..168004d 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModel.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModel.kt @@ -6,7 +6,7 @@ import com.nativeapptemplate.nativeapptemplatefree.NatConstants import com.nativeapptemplate.nativeapptemplatefree.common.errors.codedDescription import com.nativeapptemplate.nativeapptemplatefree.data.login.SignUpRepository import com.nativeapptemplate.nativeapptemplatefree.model.SendConfirmation -import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.validateEmail +import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.isValidEmail import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -75,7 +75,7 @@ class ResendConfirmationInstructionsViewModel @Inject constructor( fun hasInvalidDataEmail(): Boolean { if (uiState.value.email.isBlank()) return true - return !uiState.value.email.validateEmail() + return !uiState.value.email.isValidEmail() } fun updateEmail(newEmail: String) { diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModel.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModel.kt index 927244e..084657e 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModel.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModel.kt @@ -9,7 +9,7 @@ import com.nativeapptemplate.nativeapptemplatefree.data.login.LoginRepository import com.nativeapptemplate.nativeapptemplatefree.model.LoggedInShopkeeper import com.nativeapptemplate.nativeapptemplatefree.model.Login import com.nativeapptemplate.nativeapptemplatefree.model.Permissions -import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.validateEmail +import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.isValidEmail import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -94,7 +94,7 @@ class SignInEmailAndPasswordViewModel @Inject constructor( fun hasInvalidDataEmail(): Boolean { if (uiState.value.email.isBlank()) return true - return !uiState.value.email.validateEmail() + return !uiState.value.email.isValidEmail() } fun hasInvalidDataPassword(): Boolean { diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModel.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModel.kt index 9348f8e..ca1fe8f 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModel.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModel.kt @@ -7,7 +7,7 @@ import com.nativeapptemplate.nativeapptemplatefree.common.errors.codedDescriptio import com.nativeapptemplate.nativeapptemplatefree.data.login.SignUpRepository import com.nativeapptemplate.nativeapptemplatefree.model.SignUp import com.nativeapptemplate.nativeapptemplatefree.model.TimeZones -import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.validateEmail +import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.isValidEmail import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -88,7 +88,7 @@ class SignUpViewModel @Inject constructor( fun hasInvalidDataEmail(): Boolean { if (uiState.value.email.isBlank()) return true - return !uiState.value.email.validateEmail() + return !uiState.value.email.isValidEmail() } fun hasInvalidDataPassword(): Boolean { diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModel.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModel.kt index 3999a9c..3c085f3 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModel.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModel.kt @@ -9,7 +9,7 @@ import com.nativeapptemplate.nativeapptemplatefree.data.login.SignUpRepository import com.nativeapptemplate.nativeapptemplatefree.model.SignUpForUpdate import com.nativeapptemplate.nativeapptemplatefree.model.TimeZones import com.nativeapptemplate.nativeapptemplatefree.model.UserData -import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.validateEmail +import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.isValidEmail import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -198,7 +198,7 @@ class ShopkeeperEditViewModel @Inject constructor( fun hasInvalidDataEmail(): Boolean { if (uiState.value.email.isBlank()) return true - return !uiState.value.email.validateEmail() + return !uiState.value.email.isValidEmail() } fun updateName(newName: String) { diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtility.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtility.kt index 70615ce..8eefbd3 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtility.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtility.kt @@ -4,38 +4,12 @@ import java.time.ZoneId import java.time.ZonedDateTime object DateUtility { - fun ZonedDateTime.cardDateString(): String { - val dateTimeFormatter = DateTimeFormatterUtility.cardDateFormatter() - return this.format(dateTimeFormatter) - } - - fun String.cardDateString(zoneId: ZoneId = ZoneId.systemDefault()): String { - if (this.isBlank()) return "" - - val date = ZonedDateTime.parse(this).withZoneSameInstant(zoneId) - return date.cardDateString() - } - - fun ZonedDateTime.cardTimeString(): String { - val dateTimeFormatter = DateTimeFormatterUtility.cardTimeFormatter() - return this.format(dateTimeFormatter) - } - - fun String.cardTimeString(zoneId: ZoneId = ZoneId.systemDefault()): String { - if (this.isBlank()) return "" - - val date = ZonedDateTime.parse(this).withZoneSameInstant(zoneId) - return date.cardTimeString() - } - - fun ZonedDateTime.cardDateTimeString(): String { - return "${this.cardDateString()} ${this.cardTimeString()}" - } - fun String.cardDateTimeString(zoneId: ZoneId = ZoneId.systemDefault()): String { if (this.isBlank()) return "" val date = ZonedDateTime.parse(this).withZoneSameInstant(zoneId) - return date.cardDateTimeString() + val dateString = date.format(DateTimeFormatterUtility.cardDateFormatter()) + val timeString = date.format(DateTimeFormatterUtility.cardTimeFormatter()) + return "$dateString $timeString" } } diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt index 0fa5204..a761960 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt @@ -12,7 +12,7 @@ import com.nativeapptemplate.nativeapptemplatefree.R import java.util.Locale object Utility { - fun String.validateEmail(): Boolean { + fun String.isValidEmail(): Boolean { return this.isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c715ee9..beca9a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,8 +105,8 @@ Buy milk Add Item Tag Add a new item tag and start changing the item tag status. - Tag name is invalid. - Tag description is invalid. + Item tag name is invalid. + Item tag description is invalid. Name must be 1-%1$d characters. Description must be 0-%1$d characters. Mark as completed diff --git a/app/src/main/res/xml/filepaths.xml b/app/src/main/res/xml/filepaths.xml deleted file mode 100644 index 53f48e4..0000000 --- a/app/src/main/res/xml/filepaths.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModelTest.kt b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModelTest.kt index 3490dea..325bd3b 100644 --- a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModelTest.kt +++ b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ForgotPasswordViewModelTest.kt @@ -15,7 +15,7 @@ import org.robolectric.RobolectricTestRunner /** * These tests use Robolectric because the subject under test (the ViewModel) uses - * `String.validateEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. + * `String.isValidEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. */ @RunWith(RobolectricTestRunner::class) class ForgotPasswordViewModelTest { diff --git a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModelTest.kt b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModelTest.kt index 80e55aa..557caa9 100644 --- a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModelTest.kt +++ b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/ResendConfirmationInstructionsViewModelTest.kt @@ -15,7 +15,7 @@ import org.robolectric.RobolectricTestRunner /** * These tests use Robolectric because the subject under test (the ViewModel) uses - * `String.validateEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. + * `String.isValidEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. */ @RunWith(RobolectricTestRunner::class) class ResendConfirmationInstructionsViewModelTest { diff --git a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModelTest.kt b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModelTest.kt index a685535..246e3ae 100644 --- a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModelTest.kt +++ b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignInEmailAndPasswordViewModelTest.kt @@ -21,7 +21,7 @@ import org.robolectric.RobolectricTestRunner /** * These tests use Robolectric because the subject under test (the ViewModel) uses - * `String.validateEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. + * `String.isValidEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. */ @RunWith(RobolectricTestRunner::class) class SignInEmailAndPasswordViewModelTest { diff --git a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModelTest.kt b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModelTest.kt index 00f01d2..8a22156 100644 --- a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModelTest.kt +++ b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/SignUpViewModelTest.kt @@ -18,7 +18,7 @@ import org.robolectric.RobolectricTestRunner /** * These tests use Robolectric because the subject under test (the ViewModel) uses - * `String.validateEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. + * `String.isValidEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. */ @RunWith(RobolectricTestRunner::class) class SignUpViewModelTest { diff --git a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModelTest.kt b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModelTest.kt index 3514c64..a685872 100644 --- a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModelTest.kt +++ b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/settings/ShopkeeperEditViewModelTest.kt @@ -21,7 +21,7 @@ import org.robolectric.RobolectricTestRunner /** * These tests use Robolectric because the subject under test (the ViewModel) uses - * `String.validateEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. + * `String.isValidEmail` which has a dependency on `android.util.Patterns.EMAIL_ADDRESS`. */ @RunWith(RobolectricTestRunner::class) class ShopkeeperEditViewModelTest { diff --git a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtilityTest.kt b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtilityTest.kt index b034843..7bcac7c 100644 --- a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtilityTest.kt +++ b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/DateUtilityTest.kt @@ -1,108 +1,27 @@ package com.nativeapptemplate.nativeapptemplatefree.utils -import com.nativeapptemplate.nativeapptemplatefree.utils.DateUtility.cardDateString import com.nativeapptemplate.nativeapptemplatefree.utils.DateUtility.cardDateTimeString -import com.nativeapptemplate.nativeapptemplatefree.utils.DateUtility.cardTimeString import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Test import java.time.ZoneId -import java.time.ZonedDateTime class DateUtilityTest { - private val testZonedDateTime = ZonedDateTime.of( - 2025, - 3, - 15, - 14, - 30, - 0, - 0, - ZoneId.of("UTC"), - ) - - // ZonedDateTime extension tests - - @Test - fun zonedDateTime_cardDateString_formatsCorrectly() { - val result = testZonedDateTime.cardDateString() - // Locale-safe: verify it contains day and year - assertTrue(result.contains("15")) - assertTrue(result.contains("2025")) - } - - @Test - fun zonedDateTime_cardTimeString_formatsCorrectly() { - assertEquals("14:30", testZonedDateTime.cardTimeString()) - } - @Test - fun zonedDateTime_cardDateTimeString_combinesDateAndTime() { - val result = testZonedDateTime.cardDateTimeString() - assertTrue(result.contains("15")) - assertTrue(result.contains("2025")) - assertTrue(result.contains("14:30")) + fun string_cardDateTimeString_withUtcZone_formatsCorrectly() { + val dateString = "2025-06-15T14:30:00Z" + assertEquals("2025/06/15 14:30", dateString.cardDateTimeString(ZoneId.of("UTC"))) } @Test - fun string_cardDateTimeString_returnsEmptyForBlankString() { + fun string_cardDateTimeString_blankReturnsEmpty() { assertEquals("", "".cardDateTimeString()) } - // String extension tests with UTC zone - - @Test - fun string_cardDateString_formatsIsoStringWithUtcZone() { - val isoString = "2025-03-15T14:30:00Z" - val result = isoString.cardDateString(ZoneId.of("UTC")) - assertTrue(result.contains("15")) - assertTrue(result.contains("2025")) - } - - @Test - fun string_cardTimeString_formatsIsoStringWithUtcZone() { - val isoString = "2025-03-15T14:30:00Z" - assertEquals("14:30", isoString.cardTimeString(ZoneId.of("UTC"))) - } - - // Blank string tests - - @Test - fun string_cardDateString_returnsEmptyForBlankString() { - assertEquals("", "".cardDateString()) - } - - @Test - fun string_cardTimeString_returnsEmptyForBlankString() { - assertEquals("", "".cardTimeString()) - } - - @Test - fun string_cardDateString_returnsEmptyForWhitespaceString() { - assertEquals("", " ".cardDateString()) - } - - @Test - fun string_cardTimeString_returnsEmptyForWhitespaceString() { - assertEquals("", " ".cardTimeString()) - } - - // Timezone conversion tests - - @Test - fun string_cardDateString_convertsTimezoneCorrectly() { - // 2025-03-15T23:30:00Z in UTC is 2025-03-16 08:30 in Asia/Tokyo (+9) - val isoString = "2025-03-15T23:30:00Z" - val result = isoString.cardDateString(ZoneId.of("Asia/Tokyo")) - assertTrue(result.contains("16")) - assertTrue(result.contains("2025")) - } - @Test - fun string_cardTimeString_convertsTimezoneCorrectly() { - // 2025-03-15T14:30:00Z in UTC is 23:30 in Asia/Tokyo (+9) - val isoString = "2025-03-15T14:30:00Z" - assertEquals("23:30", isoString.cardTimeString(ZoneId.of("Asia/Tokyo"))) + fun string_cardDateTimeString_convertsTimezone() { + // UTC 14:30 -> Tokyo (UTC+9) is 23:30 same day + val dateString = "2025-06-15T14:30:00Z" + assertEquals("2025/06/15 23:30", dateString.cardDateTimeString(ZoneId.of("Asia/Tokyo"))) } } diff --git a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/UtilityTest.kt b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/UtilityTest.kt index c6da1dc..6029c26 100644 --- a/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/UtilityTest.kt +++ b/app/src/test/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/UtilityTest.kt @@ -1,6 +1,6 @@ package com.nativeapptemplate.nativeapptemplatefree.utils -import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.validateEmail +import com.nativeapptemplate.nativeapptemplatefree.utils.Utility.isValidEmail import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test @@ -10,25 +10,25 @@ import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class UtilityTest { - // validateEmail tests + // isValidEmail tests @Test - fun validateEmail_validEmail_returnsTrue() { - assertTrue("test@example.com".validateEmail()) + fun isValidEmail_validEmail_returnsTrue() { + assertTrue("test@example.com".isValidEmail()) } @Test - fun validateEmail_emptyString_returnsFalse() { - assertFalse("".validateEmail()) + fun isValidEmail_emptyString_returnsFalse() { + assertFalse("".isValidEmail()) } @Test - fun validateEmail_noAtSign_returnsFalse() { - assertFalse("testexample.com".validateEmail()) + fun isValidEmail_noAtSign_returnsFalse() { + assertFalse("testexample.com".isValidEmail()) } @Test - fun validateEmail_noDomain_returnsFalse() { - assertFalse("test@".validateEmail()) + fun isValidEmail_noDomain_returnsFalse() { + assertFalse("test@".isValidEmail()) } }