Home | History | Annotate | Download | only in big
      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 
      5 package big
      6 
      7 import (
      8 	"bytes"
      9 	"encoding/gob"
     10 	"encoding/json"
     11 	"io"
     12 	"testing"
     13 )
     14 
     15 var floatVals = []string{
     16 	"0",
     17 	"1",
     18 	"0.1",
     19 	"2.71828",
     20 	"1234567890",
     21 	"3.14e1234",
     22 	"3.14e-1234",
     23 	"0.738957395793475734757349579759957975985497e100",
     24 	"0.73895739579347546656564656573475734957975995797598589749859834759476745986795497e100",
     25 	"inf",
     26 	"Inf",
     27 }
     28 
     29 func TestFloatGobEncoding(t *testing.T) {
     30 	var medium bytes.Buffer
     31 	enc := gob.NewEncoder(&medium)
     32 	dec := gob.NewDecoder(&medium)
     33 	for _, test := range floatVals {
     34 		for _, sign := range []string{"", "+", "-"} {
     35 			for _, prec := range []uint{0, 1, 2, 10, 53, 64, 100, 1000} {
     36 				for _, mode := range []RoundingMode{ToNearestEven, ToNearestAway, ToZero, AwayFromZero, ToNegativeInf, ToPositiveInf} {
     37 					medium.Reset() // empty buffer for each test case (in case of failures)
     38 					x := sign + test
     39 
     40 					var tx Float
     41 					_, _, err := tx.SetPrec(prec).SetMode(mode).Parse(x, 0)
     42 					if err != nil {
     43 						t.Errorf("parsing of %s (%dbits, %v) failed (invalid test case): %v", x, prec, mode, err)
     44 						continue
     45 					}
     46 
     47 					// If tx was set to prec == 0, tx.Parse(x, 0) assumes precision 64. Correct it.
     48 					if prec == 0 {
     49 						tx.SetPrec(0)
     50 					}
     51 
     52 					if err := enc.Encode(&tx); err != nil {
     53 						t.Errorf("encoding of %v (%dbits, %v) failed: %v", &tx, prec, mode, err)
     54 						continue
     55 					}
     56 
     57 					var rx Float
     58 					if err := dec.Decode(&rx); err != nil {
     59 						t.Errorf("decoding of %v (%dbits, %v) failed: %v", &tx, prec, mode, err)
     60 						continue
     61 					}
     62 
     63 					if rx.Cmp(&tx) != 0 {
     64 						t.Errorf("transmission of %s failed: got %s want %s", x, rx.String(), tx.String())
     65 						continue
     66 					}
     67 
     68 					if rx.Prec() != prec {
     69 						t.Errorf("transmission of %s's prec failed: got %d want %d", x, rx.Prec(), prec)
     70 					}
     71 
     72 					if rx.Mode() != mode {
     73 						t.Errorf("transmission of %s's mode failed: got %s want %s", x, rx.Mode(), mode)
     74 					}
     75 
     76 					if rx.Acc() != tx.Acc() {
     77 						t.Errorf("transmission of %s's accuracy failed: got %s want %s", x, rx.Acc(), tx.Acc())
     78 					}
     79 				}
     80 			}
     81 		}
     82 	}
     83 }
     84 
     85 func TestFloatCorruptGob(t *testing.T) {
     86 	var buf bytes.Buffer
     87 	tx := NewFloat(4 / 3).SetPrec(1000).SetMode(ToPositiveInf)
     88 	if err := gob.NewEncoder(&buf).Encode(tx); err != nil {
     89 		t.Fatal(err)
     90 	}
     91 	b := buf.Bytes()
     92 
     93 	var rx Float
     94 	if err := gob.NewDecoder(bytes.NewReader(b)).Decode(&rx); err != nil {
     95 		t.Fatal(err)
     96 	}
     97 
     98 	if err := gob.NewDecoder(bytes.NewReader(b[:10])).Decode(&rx); err != io.ErrUnexpectedEOF {
     99 		t.Errorf("got %v want EOF", err)
    100 	}
    101 
    102 	b[1] = 0
    103 	if err := gob.NewDecoder(bytes.NewReader(b)).Decode(&rx); err == nil {
    104 		t.Fatal("got nil want version error")
    105 	}
    106 }
    107 
    108 func TestFloatJSONEncoding(t *testing.T) {
    109 	for _, test := range floatVals {
    110 		for _, sign := range []string{"", "+", "-"} {
    111 			for _, prec := range []uint{0, 1, 2, 10, 53, 64, 100, 1000} {
    112 				x := sign + test
    113 				var tx Float
    114 				_, _, err := tx.SetPrec(prec).Parse(x, 0)
    115 				if err != nil {
    116 					t.Errorf("parsing of %s (prec = %d) failed (invalid test case): %v", x, prec, err)
    117 					continue
    118 				}
    119 				b, err := json.Marshal(&tx)
    120 				if err != nil {
    121 					t.Errorf("marshaling of %v (prec = %d) failed: %v", &tx, prec, err)
    122 					continue
    123 				}
    124 				var rx Float
    125 				rx.SetPrec(prec)
    126 				if err := json.Unmarshal(b, &rx); err != nil {
    127 					t.Errorf("unmarshaling of %v (prec = %d) failed: %v", &tx, prec, err)
    128 					continue
    129 				}
    130 				if rx.Cmp(&tx) != 0 {
    131 					t.Errorf("JSON encoding of %v (prec = %d) failed: got %v want %v", &tx, prec, &rx, &tx)
    132 				}
    133 			}
    134 		}
    135 	}
    136 }
    137