1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package big
6
7import (
8	"bytes"
9	"encoding/gob"
10	"encoding/json"
11	"encoding/xml"
12	"testing"
13)
14
15func TestRatGobEncoding(t *testing.T) {
16	var medium bytes.Buffer
17	enc := gob.NewEncoder(&medium)
18	dec := gob.NewDecoder(&medium)
19	for _, test := range encodingTests {
20		medium.Reset() // empty buffer for each test case (in case of failures)
21		var tx Rat
22		tx.SetString(test + ".14159265")
23		if err := enc.Encode(&tx); err != nil {
24			t.Errorf("encoding of %s failed: %s", &tx, err)
25			continue
26		}
27		var rx Rat
28		if err := dec.Decode(&rx); err != nil {
29			t.Errorf("decoding of %s failed: %s", &tx, err)
30			continue
31		}
32		if rx.Cmp(&tx) != 0 {
33			t.Errorf("transmission of %s failed: got %s want %s", &tx, &rx, &tx)
34		}
35	}
36}
37
38// Sending a nil Rat pointer (inside a slice) on a round trip through gob should yield a zero.
39// TODO: top-level nils.
40func TestGobEncodingNilRatInSlice(t *testing.T) {
41	buf := new(bytes.Buffer)
42	enc := gob.NewEncoder(buf)
43	dec := gob.NewDecoder(buf)
44
45	var in = make([]*Rat, 1)
46	err := enc.Encode(&in)
47	if err != nil {
48		t.Errorf("gob encode failed: %q", err)
49	}
50	var out []*Rat
51	err = dec.Decode(&out)
52	if err != nil {
53		t.Fatalf("gob decode failed: %q", err)
54	}
55	if len(out) != 1 {
56		t.Fatalf("wrong len; want 1 got %d", len(out))
57	}
58	var zero Rat
59	if out[0].Cmp(&zero) != 0 {
60		t.Fatalf("transmission of (*Int)(nil) failed: got %s want 0", out)
61	}
62}
63
64var ratNums = []string{
65	"-141592653589793238462643383279502884197169399375105820974944592307816406286",
66	"-1415926535897932384626433832795028841971",
67	"-141592653589793",
68	"-1",
69	"0",
70	"1",
71	"141592653589793",
72	"1415926535897932384626433832795028841971",
73	"141592653589793238462643383279502884197169399375105820974944592307816406286",
74}
75
76var ratDenoms = []string{
77	"1",
78	"718281828459045",
79	"7182818284590452353602874713526624977572",
80	"718281828459045235360287471352662497757247093699959574966967627724076630353",
81}
82
83func TestRatJSONEncoding(t *testing.T) {
84	for _, num := range ratNums {
85		for _, denom := range ratDenoms {
86			var tx Rat
87			tx.SetString(num + "/" + denom)
88			b, err := json.Marshal(&tx)
89			if err != nil {
90				t.Errorf("marshaling of %s failed: %s", &tx, err)
91				continue
92			}
93			var rx Rat
94			if err := json.Unmarshal(b, &rx); err != nil {
95				t.Errorf("unmarshaling of %s failed: %s", &tx, err)
96				continue
97			}
98			if rx.Cmp(&tx) != 0 {
99				t.Errorf("JSON encoding of %s failed: got %s want %s", &tx, &rx, &tx)
100			}
101		}
102	}
103}
104
105func TestRatXMLEncoding(t *testing.T) {
106	for _, num := range ratNums {
107		for _, denom := range ratDenoms {
108			var tx Rat
109			tx.SetString(num + "/" + denom)
110			b, err := xml.Marshal(&tx)
111			if err != nil {
112				t.Errorf("marshaling of %s failed: %s", &tx, err)
113				continue
114			}
115			var rx Rat
116			if err := xml.Unmarshal(b, &rx); err != nil {
117				t.Errorf("unmarshaling of %s failed: %s", &tx, err)
118				continue
119			}
120			if rx.Cmp(&tx) != 0 {
121				t.Errorf("XML encoding of %s failed: got %s want %s", &tx, &rx, &tx)
122			}
123		}
124	}
125}
126