// Reset implements the protobuf marshalling interface. func (q *Quantity) Unmarshal(data []byte) error { p := QuantityProto{} if err := p.Unmarshal(data); err != nil { return err } q.Format = p.Format b := big.NewInt(0) b.SetBytes(p.Bigint) q.Amount = inf.NewDecBig(b, inf.Scale(p.Scale)) return nil }
// infScale adapts a Scale value to an inf.Scale value. func (s Scale) infScale() inf.Scale { return inf.Scale(-s) // inf.Scale is upside-down }
// AsDec returns an inf.Dec representation of this value. func (a int64Amount) AsDec() *inf.Dec { var base inf.Dec base.SetUnscaled(a.value) base.SetScale(inf.Scale(-a.scale)) return &base }
func dec(i int64, exponent int) *inf.Dec { // See the below test-- scale is the negative of an exponent. return inf.NewDec(i, inf.Scale(-exponent)) }
q.Amount.SetScale(0) q.Amount.SetUnscaled(c.Int63()) return } // Be sure to test cases like 1Mi q.Amount.SetScale(0) q.Amount.SetUnscaled(c.Int63n(1024) << uint(10*c.Intn(5))) return } if c.RandBool() { q.Format = DecimalSI } else { q.Format = DecimalExponent } if c.RandBool() { q.Amount.SetScale(inf.Scale(c.Intn(4))) q.Amount.SetUnscaled(c.Int63()) return } // Be sure to test cases like 1M q.Amount.SetScale(inf.Scale(3 - c.Intn(15))) q.Amount.SetUnscaled(c.Int63n(1000)) }, ) func TestJSON(t *testing.T) { for i := 0; i < 500; i++ { q := &Quantity{} fuzzer.Fuzz(q) b, err := json.Marshal(q) if err != nil {
func dec(i int64, exponent int) *inf.Dec { return inf.NewDec(i, inf.Scale(-exponent)) }
func amount(i int64, exponent int) infDecAmount { // See the below test-- scale is the negative of an exponent. return infDecAmount{inf.NewDec(i, inf.Scale(-exponent))} }
// Be sure to test cases like 1Mi dec := &inf.Dec{} q.d = infDecAmount{Dec: dec} dec.SetScale(0) dec.SetUnscaled(c.Int63n(1024) << uint(10*c.Intn(5))) return } if c.RandBool() { q.Format = DecimalSI } else { q.Format = DecimalExponent } if c.RandBool() { dec := &inf.Dec{} q.d = infDecAmount{Dec: dec} dec.SetScale(inf.Scale(c.Intn(4))) dec.SetUnscaled(c.Int63()) return } // Be sure to test cases like 1M dec := &inf.Dec{} q.d = infDecAmount{Dec: dec} dec.SetScale(inf.Scale(3 - c.Intn(15))) dec.SetUnscaled(c.Int63n(1000)) }, ) func TestJSON(t *testing.T) { for i := 0; i < 500; i++ { q := &Quantity{} fuzzer.Fuzz(q)
// CmpInt64 returns 0 if the quantity is equal to y, -1 if the quantity is less than y, or 1 if the // quantity is greater than y. func (q *Quantity) CmpInt64(y int64) int { if q.d.Dec != nil { return q.d.Dec.Cmp(inf.NewDec(y, inf.Scale(0))) } return q.i.Cmp(int64Amount{value: y}) }