6 changed files with 124 additions and 1 deletions
@ -0,0 +1,16 @@ |
|||||
|
package com.xsn.explorer.models |
||||
|
|
||||
|
class HexString private (val string: String) extends AnyVal |
||||
|
|
||||
|
object HexString { |
||||
|
|
||||
|
private val RegEx = "^[A-Fa-f0-9]+$" |
||||
|
|
||||
|
def from(string: String): Option[HexString] = { |
||||
|
if (string.length % 2 == 0 && string.matches(RegEx)) { |
||||
|
Option(new HexString(string)) |
||||
|
} else { |
||||
|
None |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,56 @@ |
|||||
|
package com.xsn.explorer.models |
||||
|
|
||||
|
import org.scalatest.{MustMatchers, OptionValues, WordSpec} |
||||
|
|
||||
|
class HexStringSpec extends WordSpec with MustMatchers with OptionValues { |
||||
|
|
||||
|
"from" should { |
||||
|
"accept a valid hex" in { |
||||
|
val string = "0100000001d036c70b1df769fa3205f8ff4e361af84073aa14c89de80488048b6ae4904ce9010000006a47304402201f1f9aef5d60f6e84714dfb98ca87ca8a146a2e04a3811d8f0aa770d8ac1c906022054e27a26f806a5d0c0e08332be186a96ee1ac951b8d1e6e3b10072d51eb6dd300121026648fd298f1cc06c474db0864720a9774efbe789dd67b2a46086f9754e4cc3f2ffffffff030000000000000000000e77b9932d0000001976a91436e0c51c93a357e23621bb993d28e5c18f95bb5588ac00d2496b000000001976a9149d1fef13c02f2f23cf9a09ba11987e90Dbf5910d88ac00000000" |
||||
|
val result = HexString.from(string) |
||||
|
result.value.string mustEqual string |
||||
|
} |
||||
|
|
||||
|
"accept a valid hex with mixed case" in { |
||||
|
val string = "0100000001d036c70b1df769fA3205f8fF4e361af84073aa14c89de80488048b6aE4904ce9010000006a47304402201f1f9aef5d60f6e84714dfb98ca87ca8a146a2e04a3811d8f0aa770d8ac1c906022054e27a26f806a5d0c0e08332be186a96ee1ac951b8d1e6e3b10072d51eb6dd300121026648fd298f1cc06c474db0864720a9774efbe789dd67b2a46086f9754e4cc3f2ffffffff030000000000000000000e77b9932d0000001976a91436e0c51c93a357e23621bb993d28e5c18f95bb5588ac00d2496b000000001976a9149d1fef13c02f2f23cf9a09ba11987e90Dbf5910d88ac00000000" |
||||
|
val result = HexString.from(string) |
||||
|
result.value.string mustEqual string |
||||
|
} |
||||
|
|
||||
|
"accept a string with all hex characters" in { |
||||
|
val string = "abcdef0123456789ABCDEF" |
||||
|
val result = HexString.from(string) |
||||
|
result.value.string mustEqual string |
||||
|
} |
||||
|
|
||||
|
"accept a two characters string" in { |
||||
|
val string = "0f" |
||||
|
val result = HexString.from(string) |
||||
|
result.value.string mustEqual string |
||||
|
} |
||||
|
|
||||
|
"reject an empty string" in { |
||||
|
val string = "" |
||||
|
val result = HexString.from(string) |
||||
|
result.isEmpty mustEqual true |
||||
|
} |
||||
|
|
||||
|
"reject a single character" in { |
||||
|
val string = "a" |
||||
|
val result = HexString.from(string) |
||||
|
result.isEmpty mustEqual true |
||||
|
} |
||||
|
|
||||
|
"reject spaces" in { |
||||
|
val string = "a " |
||||
|
val result = HexString.from(string) |
||||
|
result.isEmpty mustEqual true |
||||
|
} |
||||
|
|
||||
|
"reject non-hex characters" in { |
||||
|
val string = "abcdefg" |
||||
|
val result = HexString.from(string) |
||||
|
result.isEmpty mustEqual true |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue