Skip to content

Commit

Permalink
✨ Add EmailAddress.Companion.orThrow(String, String) (#692)
Browse files Browse the repository at this point in the history
  • Loading branch information
LVMVRQUXL committed Aug 11, 2024
1 parent 6e6faef commit f69216d
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 0 deletions.
2 changes: 2 additions & 0 deletions subprojects/library/src/api/types.api
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,7 @@ public final class org/kotools/types/EmailAddress {
public static final fun fromString (Ljava/lang/Object;Ljava/lang/Object;)Lorg/kotools/types/EmailAddress;
public final fun hashCode ()I
public static final fun orThrow (Ljava/lang/String;)Lorg/kotools/types/EmailAddress;
public static final fun orThrow (Ljava/lang/String;Ljava/lang/String;)Lorg/kotools/types/EmailAddress;
public final fun toString ()Ljava/lang/String;
}

Expand All @@ -443,6 +444,7 @@ public final class org/kotools/types/EmailAddress$Companion {
public final synthetic fun fromStringOrNull (Ljava/lang/Object;)Lorg/kotools/types/EmailAddress;
public final synthetic fun fromStringOrNull (Ljava/lang/Object;Ljava/lang/Object;)Lorg/kotools/types/EmailAddress;
public final fun orThrow (Ljava/lang/String;)Lorg/kotools/types/EmailAddress;
public final fun orThrow (Ljava/lang/String;Ljava/lang/String;)Lorg/kotools/types/EmailAddress;
}

public final class org/kotools/types/Zero {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -350,5 +350,48 @@ public class EmailAddress private constructor(private val text: String) {
require(text matches regex) { InvalidEmailAddress(text, pattern) }
return EmailAddress(text)
}

/**
* Creates an instance of [EmailAddress] from the specified [text].
* Throws an [IllegalArgumentException] if the [text] doesn't match the
* specified [pattern], or if the [pattern] doesn't match the
* [default one][PATTERN].
*
* <br>
* <details>
* <summary>
* <b>Calling from Kotlin</b>
* </summary>
*
* Here's an example of calling this method from Kotlin code:
*
* SAMPLE: [org.kotools.types.EmailAddressCompanionCommonSample.orThrowStringString]
* </details>
*
* <br>
* <details>
* <summary>
* <b>Calling from Java</b>
* </summary>
*
* Here's an example of calling this method from Java code:
*
* SAMPLE: [org.kotools.types.EmailAddressCompanionJavaSample.orThrowStringString]
* </details>
*/
@ExperimentalSince(KotoolsTypesVersion.Unreleased)
@JvmStatic
public fun orThrow(text: String, pattern: String): EmailAddress {
val validationPattern: String = this.PATTERN
val patternRegex = Regex(validationPattern)
require(pattern matches patternRegex) {
InvalidEmailAddressPattern(pattern, validationPattern)
}
val textRegex = Regex(pattern)
require(text matches textRegex) {
InvalidEmailAddress(text, pattern)
}
return EmailAddress(text)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,17 @@ class EmailAddressCompanionCommonSample {
}
assertTrue(isSuccess)
}

@Test
fun orThrowStringString() {
val text = "[email protected]"
val pattern = """^[a-z]+@[a-z]+\.[a-z]+$"""
val isSuccess: Boolean = try {
EmailAddress.orThrow(text, pattern)
true
} catch (exception: IllegalArgumentException) {
false
}
assertTrue(isSuccess)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -263,4 +263,39 @@ class EmailAddressCompanionTest {
).toString()
assertEquals(expected, actual)
}

@Test
fun orThrowStringStringShouldPassWithValidTextAndPattern() {
val text: String = Values.VALID
val pattern = """^[a-z]+@[a-z]+\.[a-z]+$"""
EmailAddress.orThrow(text, pattern)
}

@Test
fun orThrowStringStringShouldFailWithInvalidText() {
val text = "[email protected]"
val pattern = """^[a-z]+@[a-z]+\.[a-z]+$"""
val exception: IllegalArgumentException = assertFailsWith {
EmailAddress.orThrow(text, pattern)
}
val actual: String? = exception.message
val expected: String = InvalidEmailAddress(text, pattern)
.toString()
assertEquals(expected, actual)
}

@Test
fun orThrowStringStringShouldFailWithInvalidPattern() {
val text: String = Values.VALID
val pattern = """^[a-z]+\.[a-z]+$"""
val exception: IllegalArgumentException = assertFailsWith {
EmailAddress.orThrow(text, pattern)
}
val actual: String? = exception.message
val expected: String = InvalidEmailAddressPattern(
pattern,
validationPattern = EmailAddress.PATTERN
).toString()
assertEquals(expected, actual)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,18 @@ void orThrowString() {
}
Assertions.assertTrue(isSuccess);
}

@Test
void orThrowStringString() {
final String text = "[email protected]";
final String pattern = "^[a-z]+@[a-z]+\\.[a-z]+$";
boolean isSuccess;
try {
EmailAddress.orThrow(text, pattern);
isSuccess = true;
} catch (final IllegalArgumentException exception) {
isSuccess = false;
}
Assertions.assertTrue(isSuccess);
}
}

0 comments on commit f69216d

Please sign in to comment.