SegwitAddressTest.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. namespace BitWasp\Test\Bech32;
  3. use function BitWasp\Bech32\decodeSegwit;
  4. use function BitWasp\Bech32\encodeSegwit;
  5. use BitWasp\Bech32\Exception\Bech32Exception;
  6. use BitWasp\Test\Bech32\Provider\InvalidAddresses;
  7. use BitWasp\Test\Bech32\Provider\ValidAddresses;
  8. class SegwitAddressTest extends TestCase
  9. {
  10. /**
  11. * @return array
  12. */
  13. public function validAddressProvider()
  14. {
  15. return ValidAddresses::load();
  16. }
  17. /**
  18. * https://github.com/sipa/bech32/blob/master/ref/python/tests.py#L106
  19. * @param string $hrp
  20. * @param string $bech32
  21. * @param string $hexScript
  22. * @dataProvider validAddressProvider
  23. */
  24. public function testValidAddress($hrp, $bech32, $hexScript)
  25. {
  26. list ($version, $program) = decodeSegwit($hrp, $bech32);
  27. $this->assertEquals($hexScript, Util::witnessProgram($version, $program));
  28. $addr = encodeSegwit($hrp, $version, $program);
  29. $this->assertEquals(strtolower($bech32), strtolower($addr));
  30. }
  31. public function invalidAddressProvider()
  32. {
  33. return [
  34. ["tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty"],
  35. ["bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5"],
  36. ["BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2"],
  37. ["bc1rw5uspcuh"],
  38. ["bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90"],
  39. ["BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P"],
  40. ["tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7"],
  41. ["tb1pw508d6qejxtdg4y5r3zarqfsj6c3"],
  42. ["tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv"],
  43. ];
  44. }
  45. /**
  46. * @param string $bech32
  47. * @dataProvider invalidAddressProvider
  48. */
  49. public function testInvalidAddress($bech32)
  50. {
  51. try {
  52. decodeSegwit("bc", $bech32);
  53. $threw = false;
  54. } catch (\Exception $e) {
  55. $threw = true;
  56. }
  57. $this->assertTrue($threw, "expected mainnet hrp to fail");
  58. try {
  59. decodeSegwit("tb", $bech32);
  60. $threw = false;
  61. } catch (\Exception $e) {
  62. $threw = true;
  63. }
  64. $this->assertTrue($threw, "expected testnet hrp to fail");
  65. }
  66. /**
  67. * @return array
  68. */
  69. public function invalidAddressProvider2()
  70. {
  71. return InvalidAddresses::load();
  72. }
  73. /**
  74. * @param $prefix
  75. * @param $bech32
  76. * @param $exceptionMsg
  77. * @dataProvider invalidAddressProvider2
  78. */
  79. public function testInvalidAddressReasons($prefix, $bech32, $exceptionMsg)
  80. {
  81. $this->expectException(Bech32Exception::class);
  82. $this->expectExceptionMessage($exceptionMsg);
  83. decodeSegwit($prefix, $bech32);
  84. }
  85. }