dec_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. package dec
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "fmt"
  6. "math/big"
  7. "strings"
  8. "testing"
  9. )
  10. type decFunZZ func(z, x, y *Dec) *Dec
  11. type decArgZZ struct {
  12. z, x, y *Dec
  13. }
  14. var decSumZZ = []decArgZZ{
  15. {NewDecInt64(0), NewDecInt64(0), NewDecInt64(0)},
  16. {NewDecInt64(1), NewDecInt64(1), NewDecInt64(0)},
  17. {NewDecInt64(1111111110), NewDecInt64(123456789), NewDecInt64(987654321)},
  18. {NewDecInt64(-1), NewDecInt64(-1), NewDecInt64(0)},
  19. {NewDecInt64(864197532), NewDecInt64(-123456789), NewDecInt64(987654321)},
  20. {NewDecInt64(-1111111110), NewDecInt64(-123456789), NewDecInt64(-987654321)},
  21. {NewDec(big.NewInt(12), 2), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(2), 2)},
  22. }
  23. var decProdZZ = []decArgZZ{
  24. {NewDecInt64(0), NewDecInt64(0), NewDecInt64(0)},
  25. {NewDecInt64(0), NewDecInt64(1), NewDecInt64(0)},
  26. {NewDecInt64(1), NewDecInt64(1), NewDecInt64(1)},
  27. {NewDecInt64(-991 * 991), NewDecInt64(991), NewDecInt64(-991)},
  28. {NewDec(big.NewInt(2), 3), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(2), 2)},
  29. {NewDec(big.NewInt(2), -3), NewDec(big.NewInt(1), -1), NewDec(big.NewInt(2), -2)},
  30. {NewDec(big.NewInt(2), 3), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(2), 2)},
  31. }
  32. func TestDecSignZ(t *testing.T) {
  33. var zero Dec
  34. for _, a := range decSumZZ {
  35. s := a.z.Sign()
  36. e := a.z.Cmp(&zero)
  37. if s != e {
  38. t.Errorf("got %d; want %d for z = %v", s, e, a.z)
  39. }
  40. }
  41. }
  42. func TestDecAbsZ(t *testing.T) {
  43. var zero Dec
  44. for _, a := range decSumZZ {
  45. var z Dec
  46. z.Abs(a.z)
  47. var e Dec
  48. e.Set(a.z)
  49. if e.Cmp(&zero) < 0 {
  50. e.Sub(&zero, &e)
  51. }
  52. if z.Cmp(&e) != 0 {
  53. t.Errorf("got z = %v; want %v", z, e)
  54. }
  55. }
  56. }
  57. func testDecFunZZ(t *testing.T, msg string, f decFunZZ, a decArgZZ) {
  58. var z Dec
  59. f(&z, a.x, a.y)
  60. if (&z).Cmp(a.z) != 0 {
  61. t.Errorf("%s%+v\n\tgot z = %v; want %v", msg, a, &z, a.z)
  62. }
  63. }
  64. func TestDecSumZZ(t *testing.T) {
  65. AddZZ := func(z, x, y *Dec) *Dec { return z.Add(x, y) }
  66. SubZZ := func(z, x, y *Dec) *Dec { return z.Sub(x, y) }
  67. for _, a := range decSumZZ {
  68. arg := a
  69. testDecFunZZ(t, "AddZZ", AddZZ, arg)
  70. arg = decArgZZ{a.z, a.y, a.x}
  71. testDecFunZZ(t, "AddZZ symmetric", AddZZ, arg)
  72. arg = decArgZZ{a.x, a.z, a.y}
  73. testDecFunZZ(t, "SubZZ", SubZZ, arg)
  74. arg = decArgZZ{a.y, a.z, a.x}
  75. testDecFunZZ(t, "SubZZ symmetric", SubZZ, arg)
  76. }
  77. }
  78. func TestDecProdZZ(t *testing.T) {
  79. MulZZ := func(z, x, y *Dec) *Dec { return z.Mul(x, y) }
  80. for _, a := range decProdZZ {
  81. arg := a
  82. testDecFunZZ(t, "MulZZ", MulZZ, arg)
  83. arg = decArgZZ{a.z, a.y, a.x}
  84. testDecFunZZ(t, "MulZZ symmetric", MulZZ, arg)
  85. }
  86. }
  87. var decQuoRemZZZ = []struct {
  88. z, x, y *Dec
  89. r *big.Rat
  90. srA, srB int
  91. }{
  92. // basic examples
  93. {NewDec(big.NewInt(1), 0), NewDecInt64(2), NewDecInt64(2), big.NewRat(0, 1), 0, 1},
  94. {NewDec(big.NewInt(15), 1), NewDecInt64(3), NewDecInt64(2), big.NewRat(0, 1), 0, 1},
  95. {NewDec(big.NewInt(1), 1), NewDecInt64(1), NewDecInt64(10), big.NewRat(0, 1), 0, 1},
  96. {NewDec(big.NewInt(0), 0), NewDecInt64(2), NewDecInt64(3), big.NewRat(2, 3), 1, 1},
  97. {NewDec(big.NewInt(0), 0), NewDecInt64(2), NewDecInt64(6), big.NewRat(1, 3), 1, 1},
  98. {NewDec(big.NewInt(1), 1), NewDecInt64(2), NewDecInt64(12), big.NewRat(2, 3), 1, 1},
  99. // examples from the Go Language Specification
  100. {NewDec(big.NewInt(1), 0), NewDecInt64(5), NewDecInt64(3), big.NewRat(2, 3), 1, 1},
  101. {NewDec(big.NewInt(-1), 0), NewDecInt64(-5), NewDecInt64(3), big.NewRat(-2, 3), -1, 1},
  102. {NewDec(big.NewInt(-1), 0), NewDecInt64(5), NewDecInt64(-3), big.NewRat(-2, 3), 1, -1},
  103. {NewDec(big.NewInt(1), 0), NewDecInt64(-5), NewDecInt64(-3), big.NewRat(2, 3), -1, -1},
  104. }
  105. func TestDecQuoRem(t *testing.T) {
  106. for i, a := range decQuoRemZZZ {
  107. z, rA, rB := new(Dec), new(big.Int), new(big.Int)
  108. s := ScaleQuoExact.Scale(a.x, a.y)
  109. z.quoRem(a.x, a.y, s, true, rA, rB)
  110. if a.z.Cmp(z) != 0 || a.r.Cmp(new(big.Rat).SetFrac(rA, rB)) != 0 {
  111. t.Errorf("#%d QuoRemZZZ got %v, %v, %v; expected %v, %v", i, z, rA, rB, a.z, a.r)
  112. }
  113. if a.srA != rA.Sign() || a.srB != rB.Sign() {
  114. t.Errorf("#%d QuoRemZZZ wrong signs, got %v, %v; expected %v, %v", i, rA.Sign(), rB.Sign(), a.srA, a.srB)
  115. }
  116. }
  117. }
  118. var decRounderInputs = [...]struct {
  119. quo *Dec
  120. rA, rB *big.Int
  121. }{
  122. // examples from go language spec
  123. {NewDec(big.NewInt(1), 0), big.NewInt(2), big.NewInt(3)}, // 5 / 3
  124. {NewDec(big.NewInt(-1), 0), big.NewInt(-2), big.NewInt(3)}, // -5 / 3
  125. {NewDec(big.NewInt(-1), 0), big.NewInt(2), big.NewInt(-3)}, // 5 / -3
  126. {NewDec(big.NewInt(1), 0), big.NewInt(-2), big.NewInt(-3)}, // -5 / -3
  127. // examples from godoc
  128. {NewDec(big.NewInt(-1), 1), big.NewInt(-8), big.NewInt(10)},
  129. {NewDec(big.NewInt(-1), 1), big.NewInt(-5), big.NewInt(10)},
  130. {NewDec(big.NewInt(-1), 1), big.NewInt(-2), big.NewInt(10)},
  131. {NewDec(big.NewInt(0), 1), big.NewInt(-8), big.NewInt(10)},
  132. {NewDec(big.NewInt(0), 1), big.NewInt(-5), big.NewInt(10)},
  133. {NewDec(big.NewInt(0), 1), big.NewInt(-2), big.NewInt(10)},
  134. {NewDec(big.NewInt(0), 1), big.NewInt(0), big.NewInt(1)},
  135. {NewDec(big.NewInt(0), 1), big.NewInt(2), big.NewInt(10)},
  136. {NewDec(big.NewInt(0), 1), big.NewInt(5), big.NewInt(10)},
  137. {NewDec(big.NewInt(0), 1), big.NewInt(8), big.NewInt(10)},
  138. {NewDec(big.NewInt(1), 1), big.NewInt(2), big.NewInt(10)},
  139. {NewDec(big.NewInt(1), 1), big.NewInt(5), big.NewInt(10)},
  140. {NewDec(big.NewInt(1), 1), big.NewInt(8), big.NewInt(10)},
  141. }
  142. var decRounderResults = [...]struct {
  143. rounder Rounder
  144. results [len(decRounderInputs)]*Dec
  145. }{
  146. {RoundExact, [...]*Dec{nil, nil, nil, nil,
  147. nil, nil, nil, nil, nil, nil,
  148. NewDec(big.NewInt(0), 1), nil, nil, nil, nil, nil, nil}},
  149. {RoundDown, [...]*Dec{
  150. NewDecInt64(1), NewDecInt64(-1), NewDecInt64(-1), NewDecInt64(1),
  151. NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1),
  152. NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1),
  153. NewDec(big.NewInt(0), 1),
  154. NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1),
  155. NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1)}},
  156. {RoundUp, [...]*Dec{
  157. NewDecInt64(2), NewDecInt64(-2), NewDecInt64(-2), NewDecInt64(2),
  158. NewDec(big.NewInt(-2), 1), NewDec(big.NewInt(-2), 1), NewDec(big.NewInt(-2), 1),
  159. NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1),
  160. NewDec(big.NewInt(0), 1),
  161. NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1),
  162. NewDec(big.NewInt(2), 1), NewDec(big.NewInt(2), 1), NewDec(big.NewInt(2), 1)}},
  163. {RoundHalfDown, [...]*Dec{
  164. NewDecInt64(2), NewDecInt64(-2), NewDecInt64(-2), NewDecInt64(2),
  165. NewDec(big.NewInt(-2), 1), NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1),
  166. NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1),
  167. NewDec(big.NewInt(0), 1),
  168. NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1), NewDec(big.NewInt(1), 1),
  169. NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(2), 1)}},
  170. {RoundHalfUp, [...]*Dec{
  171. NewDecInt64(2), NewDecInt64(-2), NewDecInt64(-2), NewDecInt64(2),
  172. NewDec(big.NewInt(-2), 1), NewDec(big.NewInt(-2), 1), NewDec(big.NewInt(-1), 1),
  173. NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(0), 1),
  174. NewDec(big.NewInt(0), 1),
  175. NewDec(big.NewInt(0), 1), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1),
  176. NewDec(big.NewInt(1), 1), NewDec(big.NewInt(2), 1), NewDec(big.NewInt(2), 1)}},
  177. {RoundFloor, [...]*Dec{
  178. NewDecInt64(1), NewDecInt64(-2), NewDecInt64(-2), NewDecInt64(1),
  179. NewDec(big.NewInt(-2), 1), NewDec(big.NewInt(-2), 1), NewDec(big.NewInt(-2), 1),
  180. NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1),
  181. NewDec(big.NewInt(0), 1),
  182. NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1),
  183. NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1)}},
  184. {RoundCeil, [...]*Dec{
  185. NewDecInt64(2), NewDecInt64(-1), NewDecInt64(-1), NewDecInt64(2),
  186. NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1), NewDec(big.NewInt(-1), 1),
  187. NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1), NewDec(big.NewInt(0), 1),
  188. NewDec(big.NewInt(0), 1),
  189. NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1), NewDec(big.NewInt(1), 1),
  190. NewDec(big.NewInt(2), 1), NewDec(big.NewInt(2), 1), NewDec(big.NewInt(2), 1)}},
  191. }
  192. func TestDecRounders(t *testing.T) {
  193. for i, a := range decRounderResults {
  194. for j, input := range decRounderInputs {
  195. q := new(Dec).Set(input.quo)
  196. rA, rB := new(big.Int).Set(input.rA), new(big.Int).Set(input.rB)
  197. res := a.rounder.Round(new(Dec), q, rA, rB)
  198. if a.results[j] == nil && res == nil {
  199. continue
  200. }
  201. if (a.results[j] == nil && res != nil) ||
  202. (a.results[j] != nil && res == nil) ||
  203. a.results[j].Cmp(res) != 0 {
  204. t.Errorf("#%d,%d Rounder got %v; expected %v", i, j, res, a.results[j])
  205. }
  206. }
  207. }
  208. }
  209. var decRoundTests = [...]struct {
  210. in *Dec
  211. s Scale
  212. r Rounder
  213. exp *Dec
  214. }{
  215. {NewDec(big.NewInt(123424999999999993), 15), 2, RoundHalfUp, NewDec(big.NewInt(12342), 2)},
  216. {NewDec(big.NewInt(123425000000000001), 15), 2, RoundHalfUp, NewDec(big.NewInt(12343), 2)},
  217. {NewDec(big.NewInt(123424999999999993), 15), 15, RoundHalfUp, NewDec(big.NewInt(123424999999999993), 15)},
  218. {NewDec(big.NewInt(123424999999999993), 15), 16, RoundHalfUp, NewDec(big.NewInt(1234249999999999930), 16)},
  219. {NewDec(new(big.Int).Lsh(big.NewInt(1), 64), 0), -1, RoundHalfUp, NewDec(big.NewInt(1844674407370955162), -1)},
  220. {NewDec(new(big.Int).Lsh(big.NewInt(1), 64), 0), -2, RoundHalfUp, NewDec(big.NewInt(184467440737095516), -2)},
  221. {NewDec(new(big.Int).Lsh(big.NewInt(1), 64), 0), -3, RoundHalfUp, NewDec(big.NewInt(18446744073709552), -3)},
  222. {NewDec(new(big.Int).Lsh(big.NewInt(1), 64), 0), -4, RoundHalfUp, NewDec(big.NewInt(1844674407370955), -4)},
  223. {NewDec(new(big.Int).Lsh(big.NewInt(1), 64), 0), -5, RoundHalfUp, NewDec(big.NewInt(184467440737096), -5)},
  224. {NewDec(new(big.Int).Lsh(big.NewInt(1), 64), 0), -6, RoundHalfUp, NewDec(big.NewInt(18446744073710), -6)},
  225. }
  226. func TestDecRound(t *testing.T) {
  227. for i, tt := range decRoundTests {
  228. z := new(Dec).Round(tt.in, tt.s, tt.r)
  229. if tt.exp.Cmp(z) != 0 {
  230. t.Errorf("#%d Round got %v; expected %v", i, z, tt.exp)
  231. }
  232. }
  233. }
  234. var decStringTests = []struct {
  235. in string
  236. out string
  237. val int64
  238. scale Scale // skip SetString if negative
  239. ok bool
  240. scanOk bool
  241. }{
  242. {in: "", ok: false, scanOk: false},
  243. {in: "a", ok: false, scanOk: false},
  244. {in: "z", ok: false, scanOk: false},
  245. {in: "+", ok: false, scanOk: false},
  246. {in: "-", ok: false, scanOk: false},
  247. {in: "g", ok: false, scanOk: false},
  248. {in: ".", ok: false, scanOk: false},
  249. {in: ".-0", ok: false, scanOk: false},
  250. {in: ".+0", ok: false, scanOk: false},
  251. // Scannable but not SetStringable
  252. {"0b", "ignored", 0, 0, false, true},
  253. {"0x", "ignored", 0, 0, false, true},
  254. {"0xg", "ignored", 0, 0, false, true},
  255. {"0.0g", "ignored", 0, 1, false, true},
  256. // examples from godoc for Dec
  257. {"0", "0", 0, 0, true, true},
  258. {"0.00", "0.00", 0, 2, true, true},
  259. {"ignored", "0", 0, -2, true, false},
  260. {"1", "1", 1, 0, true, true},
  261. {"1.00", "1.00", 100, 2, true, true},
  262. {"10", "10", 10, 0, true, true},
  263. {"ignored", "10", 1, -1, true, false},
  264. // other tests
  265. {"+0", "0", 0, 0, true, true},
  266. {"-0", "0", 0, 0, true, true},
  267. {"0.0", "0.0", 0, 1, true, true},
  268. {"0.1", "0.1", 1, 1, true, true},
  269. {"0.", "0", 0, 0, true, true},
  270. {"-10", "-10", -1, -1, true, true},
  271. {"-1", "-1", -1, 0, true, true},
  272. {"-0.1", "-0.1", -1, 1, true, true},
  273. {"-0.01", "-0.01", -1, 2, true, true},
  274. {"+0.", "0", 0, 0, true, true},
  275. {"-0.", "0", 0, 0, true, true},
  276. {".0", "0.0", 0, 1, true, true},
  277. {"+.0", "0.0", 0, 1, true, true},
  278. {"-.0", "0.0", 0, 1, true, true},
  279. {"0.0000000000", "0.0000000000", 0, 10, true, true},
  280. {"0.0000000001", "0.0000000001", 1, 10, true, true},
  281. {"-0.0000000000", "0.0000000000", 0, 10, true, true},
  282. {"-0.0000000001", "-0.0000000001", -1, 10, true, true},
  283. {"-10", "-10", -10, 0, true, true},
  284. {"+10", "10", 10, 0, true, true},
  285. {"00", "0", 0, 0, true, true},
  286. {"023", "23", 23, 0, true, true}, // decimal, not octal
  287. {"-02.3", "-2.3", -23, 1, true, true}, // decimal, not octal
  288. }
  289. func TestDecGetString(t *testing.T) {
  290. z := new(Dec)
  291. for i, test := range decStringTests {
  292. if !test.ok {
  293. continue
  294. }
  295. z.SetUnscaled(big.NewInt(test.val))
  296. z.SetScale(test.scale)
  297. s := z.String()
  298. if s != test.out {
  299. t.Errorf("#%da got %s; want %s", i, s, test.out)
  300. }
  301. s = fmt.Sprintf("%d", z)
  302. if s != test.out {
  303. t.Errorf("#%db got %s; want %s", i, s, test.out)
  304. }
  305. }
  306. }
  307. func TestDecSetString(t *testing.T) {
  308. tmp := new(Dec)
  309. for i, test := range decStringTests {
  310. if test.scale < 0 {
  311. // SetString only supports scale >= 0
  312. continue
  313. }
  314. // initialize to a non-zero value so that issues with parsing
  315. // 0 are detected
  316. tmp.Set(NewDecInt64(1234567890).SetScale(123))
  317. n1, ok1 := new(Dec).SetString(test.in)
  318. n2, ok2 := tmp.SetString(test.in)
  319. expected := NewDecInt64(test.val).SetScale(test.scale)
  320. if ok1 != test.ok || ok2 != test.ok {
  321. t.Errorf("#%d (input '%s') ok incorrect (should be %t)", i, test.in, test.ok)
  322. continue
  323. }
  324. if !ok1 {
  325. if n1 != nil {
  326. t.Errorf("#%d (input '%s') n1 != nil", i, test.in)
  327. }
  328. continue
  329. }
  330. if !ok2 {
  331. if n2 != nil {
  332. t.Errorf("#%d (input '%s') n2 != nil", i, test.in)
  333. }
  334. continue
  335. }
  336. if n1.Cmp(expected) != 0 {
  337. t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n1, test.val)
  338. }
  339. if n2.Cmp(expected) != 0 {
  340. t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n2, test.val)
  341. }
  342. }
  343. }
  344. func TestDecScan(t *testing.T) {
  345. tmp := new(Dec)
  346. for i, test := range decStringTests {
  347. if test.scale < 0 {
  348. // SetString only supports scale >= 0
  349. continue
  350. }
  351. // initialize to a non-zero value so that issues with parsing
  352. // 0 are detected
  353. tmp.Set(NewDecInt64(1234567890).SetScale(123))
  354. n1, n2 := new(Dec), tmp
  355. nn1, err1 := fmt.Sscan(test.in, n1)
  356. nn2, err2 := fmt.Sscan(test.in, n2)
  357. if !test.scanOk {
  358. if err1 == nil || err2 == nil {
  359. t.Errorf("#%d (input '%s') ok incorrect, should be %t", i, test.in, test.scanOk)
  360. }
  361. continue
  362. }
  363. expected := NewDecInt64(test.val).SetScale(test.scale)
  364. if nn1 != 1 || err1 != nil || nn2 != 1 || err2 != nil {
  365. t.Errorf("#%d (input '%s') error %d %v, %d %v", i, test.in, nn1, err1, nn2, err2)
  366. continue
  367. }
  368. if n1.Cmp(expected) != 0 {
  369. t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n1, test.val)
  370. }
  371. if n2.Cmp(expected) != 0 {
  372. t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n2, test.val)
  373. }
  374. }
  375. }
  376. var decScanNextTests = []struct {
  377. in string
  378. ok bool
  379. next rune
  380. }{
  381. {"", false, 0},
  382. {"a", false, 'a'},
  383. {"z", false, 'z'},
  384. {"+", false, 0},
  385. {"-", false, 0},
  386. {"g", false, 'g'},
  387. {".", false, 0},
  388. {".-0", false, '-'},
  389. {".+0", false, '+'},
  390. {"0b", true, 'b'},
  391. {"0x", true, 'x'},
  392. {"0xg", true, 'x'},
  393. {"0.0g", true, 'g'},
  394. }
  395. func TestDecScanNext(t *testing.T) {
  396. for i, test := range decScanNextTests {
  397. rdr := strings.NewReader(test.in)
  398. n1 := new(Dec)
  399. nn1, _ := fmt.Fscan(rdr, n1)
  400. if (test.ok && nn1 == 0) || (!test.ok && nn1 > 0) {
  401. t.Errorf("#%d (input '%s') ok incorrect should be %t", i, test.in, test.ok)
  402. continue
  403. }
  404. r := rune(0)
  405. nn2, err := fmt.Fscanf(rdr, "%c", &r)
  406. if test.next != r {
  407. t.Errorf("#%d (input '%s') next incorrect, got %c should be %c, %d, %v", i, test.in, r, test.next, nn2, err)
  408. }
  409. }
  410. }
  411. var decGobEncodingTests = []string{
  412. "0",
  413. "1",
  414. "2",
  415. "10",
  416. "42",
  417. "1234567890",
  418. "298472983472983471903246121093472394872319615612417471234712061",
  419. }
  420. func TestDecGobEncoding(t *testing.T) {
  421. var medium bytes.Buffer
  422. enc := gob.NewEncoder(&medium)
  423. dec := gob.NewDecoder(&medium)
  424. for i, test := range decGobEncodingTests {
  425. for j := 0; j < 2; j++ {
  426. for k := Scale(-5); k <= 5; k++ {
  427. medium.Reset() // empty buffer for each test case (in case of failures)
  428. stest := test
  429. if j != 0 {
  430. // negative numbers
  431. stest = "-" + test
  432. }
  433. var tx Dec
  434. tx.SetString(stest)
  435. tx.SetScale(k) // test with positive, negative, and zero scale
  436. if err := enc.Encode(&tx); err != nil {
  437. t.Errorf("#%d%c: encoding failed: %s", i, 'a'+j, err)
  438. }
  439. var rx Dec
  440. if err := dec.Decode(&rx); err != nil {
  441. t.Errorf("#%d%c: decoding failed: %s", i, 'a'+j, err)
  442. }
  443. if rx.Cmp(&tx) != 0 {
  444. t.Errorf("#%d%c: transmission failed: got %s want %s", i, 'a'+j, &rx, &tx)
  445. }
  446. }
  447. }
  448. }
  449. }