gmp_import.phpt 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. --TEST--
  2. gmp_import() basic tests
  3. --EXTENSIONS--
  4. gmp
  5. --FILE--
  6. <?php
  7. // Tests taken from GMPs own test suite.
  8. // format is [expected, size, options, input]
  9. $import = [
  10. ['0',1,GMP_BIG_ENDIAN,''],
  11. ['12345678',1,GMP_BIG_ENDIAN,'12345678'],
  12. ['12345678',4,GMP_BIG_ENDIAN,'12345678'],
  13. ['12345678',4,GMP_LSW_FIRST | GMP_BIG_ENDIAN,'12345678'],
  14. ['12345678',1,GMP_LSW_FIRST | GMP_LITTLE_ENDIAN,'78563412'],
  15. ['12345678',4,GMP_LITTLE_ENDIAN,'78563412'],
  16. ['12345678',4,GMP_LSW_FIRST | GMP_LITTLE_ENDIAN,'78563412'],
  17. ['123456789abc',2,GMP_BIG_ENDIAN,'123456789abc'],
  18. ['123456789abc',2,GMP_LSW_FIRST | GMP_BIG_ENDIAN,'9abc56781234'],
  19. ['123456789abc',2,GMP_LITTLE_ENDIAN,'34127856bc9a'],
  20. ['123456789abc',2,GMP_LSW_FIRST | GMP_LITTLE_ENDIAN,'bc9a78563412'],
  21. ['112233445566778899aabbcc',4,GMP_BIG_ENDIAN,'112233445566778899aabbcc'],
  22. ['112233445566778899aabbcc',4,GMP_LSW_FIRST | GMP_BIG_ENDIAN,'99aabbcc5566778811223344'],
  23. ['112233445566778899aabbcc',4,GMP_LITTLE_ENDIAN,'4433221188776655ccbbaa99'],
  24. ['112233445566778899aabbcc',4,GMP_LSW_FIRST | GMP_LITTLE_ENDIAN,'ccbbaa998877665544332211'],
  25. ['100120023003400450056006700780089009a00ab00bc00c',8,GMP_BIG_ENDIAN,'100120023003400450056006700780089009a00ab00bc00c'],
  26. ['100120023003400450056006700780089009a00ab00bc00c',8,GMP_LSW_FIRST | GMP_BIG_ENDIAN,'9009a00ab00bc00c50056006700780081001200230034004'],
  27. ['100120023003400450056006700780089009a00ab00bc00c',8,GMP_LITTLE_ENDIAN,'044003300220011008800770066005500cc00bb00aa00990'],
  28. ['100120023003400450056006700780089009a00ab00bc00c',8,GMP_LSW_FIRST | GMP_LITTLE_ENDIAN,'0cc00bb00aa0099008800770066005500440033002200110']
  29. ];
  30. $passed = true;
  31. foreach ($import as $k => $test) {
  32. $gmp = gmp_import(hex2bin($test[3]), $test[1], $test[2]);
  33. if ($gmp instanceof GMP) {
  34. $result = gmp_strval($gmp, 16);
  35. if ($result !== $test[0]) {
  36. echo "$k: '$result' !== '{$test[0]}'\n";
  37. $passed = false;
  38. }
  39. } else {
  40. $type = gettype($gmp);
  41. echo "$k: $type !== '{$test[0]}'\n";
  42. }
  43. }
  44. var_dump($passed);
  45. // Invalid word sizes
  46. try {
  47. var_dump(gmp_import('a', -1));
  48. } catch (\ValueError $e) {
  49. echo $e->getMessage() . \PHP_EOL;
  50. }
  51. try {
  52. var_dump(gmp_import('a', 0));
  53. } catch (\ValueError $e) {
  54. echo $e->getMessage() . \PHP_EOL;
  55. }
  56. // Invalid data lengths
  57. try {
  58. var_dump(gmp_import('a', 2));
  59. } catch (\ValueError $e) {
  60. echo $e->getMessage() . \PHP_EOL;
  61. }
  62. try {
  63. var_dump(gmp_import('aa', 3));
  64. } catch (\ValueError $e) {
  65. echo $e->getMessage() . \PHP_EOL;
  66. }
  67. try {
  68. var_dump(gmp_import(str_repeat('a', 100), 64));
  69. } catch (\ValueError $e) {
  70. echo $e->getMessage() . \PHP_EOL;
  71. }
  72. // Invalid options
  73. try {
  74. var_dump(gmp_import('a', 1, GMP_MSW_FIRST | GMP_LSW_FIRST));
  75. } catch (\ValueError $e) {
  76. echo $e->getMessage() . \PHP_EOL;
  77. }
  78. try {
  79. var_dump(gmp_import('a', 1, GMP_BIG_ENDIAN | GMP_LITTLE_ENDIAN));
  80. } catch (\ValueError $e) {
  81. echo $e->getMessage() . \PHP_EOL;
  82. }
  83. ?>
  84. --EXPECT--
  85. bool(true)
  86. gmp_import(): Argument #2 ($word_size) must be greater than or equal to 1
  87. gmp_import(): Argument #2 ($word_size) must be greater than or equal to 1
  88. gmp_import(): Argument #1 ($data) must be a multiple of argument #2 ($word_size)
  89. gmp_import(): Argument #1 ($data) must be a multiple of argument #2 ($word_size)
  90. gmp_import(): Argument #1 ($data) must be a multiple of argument #2 ($word_size)
  91. gmp_import(): Argument #3 ($flags) cannot use multiple word order options
  92. gmp_import(): Argument #3 ($flags) cannot use multiple endian options