OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [strconv/] [itoa_test.go] - Rev 761

Go to most recent revision | Compare with Previous | Blame | View Log

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package strconv_test

import (
        "runtime"
        . "strconv"
        "testing"
)

type itob64Test struct {
        in   int64
        base int
        out  string
}

var itob64tests = []itob64Test{
        {0, 10, "0"},
        {1, 10, "1"},
        {-1, 10, "-1"},
        {12345678, 10, "12345678"},
        {-987654321, 10, "-987654321"},
        {1<<31 - 1, 10, "2147483647"},
        {-1<<31 + 1, 10, "-2147483647"},
        {1 << 31, 10, "2147483648"},
        {-1 << 31, 10, "-2147483648"},
        {1<<31 + 1, 10, "2147483649"},
        {-1<<31 - 1, 10, "-2147483649"},
        {1<<32 - 1, 10, "4294967295"},
        {-1<<32 + 1, 10, "-4294967295"},
        {1 << 32, 10, "4294967296"},
        {-1 << 32, 10, "-4294967296"},
        {1<<32 + 1, 10, "4294967297"},
        {-1<<32 - 1, 10, "-4294967297"},
        {1 << 50, 10, "1125899906842624"},
        {1<<63 - 1, 10, "9223372036854775807"},
        {-1<<63 + 1, 10, "-9223372036854775807"},
        {-1 << 63, 10, "-9223372036854775808"},

        {0, 2, "0"},
        {10, 2, "1010"},
        {-1, 2, "-1"},
        {1 << 15, 2, "1000000000000000"},

        {-8, 8, "-10"},
        {057635436545, 8, "57635436545"},
        {1 << 24, 8, "100000000"},

        {16, 16, "10"},
        {-0x123456789abcdef, 16, "-123456789abcdef"},
        {1<<63 - 1, 16, "7fffffffffffffff"},
        {1<<63 - 1, 2, "111111111111111111111111111111111111111111111111111111111111111"},

        {16, 17, "g"},
        {25, 25, "10"},
        {(((((17*35+24)*35+21)*35+34)*35+12)*35+24)*35 + 32, 35, "holycow"},
        {(((((17*36+24)*36+21)*36+34)*36+12)*36+24)*36 + 32, 36, "holycow"},
}

func TestItoa(t *testing.T) {
        for _, test := range itob64tests {
                s := FormatInt(test.in, test.base)
                if s != test.out {
                        t.Errorf("FormatInt(%v, %v) = %v want %v",
                                test.in, test.base, s, test.out)
                }
                x := AppendInt([]byte("abc"), test.in, test.base)
                if string(x) != "abc"+test.out {
                        t.Errorf("AppendInt(%q, %v, %v) = %q want %v",
                                "abc", test.in, test.base, x, test.out)
                }

                if test.in >= 0 {
                        s := FormatUint(uint64(test.in), test.base)
                        if s != test.out {
                                t.Errorf("FormatUint(%v, %v) = %v want %v",
                                        test.in, test.base, s, test.out)
                        }
                        x := AppendUint(nil, uint64(test.in), test.base)
                        if string(x) != test.out {
                                t.Errorf("AppendUint(%q, %v, %v) = %q want %v",
                                        "abc", uint64(test.in), test.base, x, test.out)
                        }
                }

                if test.base == 10 && int64(int(test.in)) == test.in {
                        s := Itoa(int(test.in))
                        if s != test.out {
                                t.Errorf("Itoa(%v) = %v want %v",
                                        test.in, s, test.out)
                        }
                }
        }
}

type uitob64Test struct {
        in   uint64
        base int
        out  string
}

var uitob64tests = []uitob64Test{
        {1<<63 - 1, 10, "9223372036854775807"},
        {1 << 63, 10, "9223372036854775808"},
        {1<<63 + 1, 10, "9223372036854775809"},
        {1<<64 - 2, 10, "18446744073709551614"},
        {1<<64 - 1, 10, "18446744073709551615"},
        {1<<64 - 1, 2, "1111111111111111111111111111111111111111111111111111111111111111"},
}

func TestUitoa(t *testing.T) {
        for _, test := range uitob64tests {
                s := FormatUint(test.in, test.base)
                if s != test.out {
                        t.Errorf("FormatUint(%v, %v) = %v want %v",
                                test.in, test.base, s, test.out)
                }
                x := AppendUint([]byte("abc"), test.in, test.base)
                if string(x) != "abc"+test.out {
                        t.Errorf("AppendUint(%q, %v, %v) = %q want %v",
                                "abc", test.in, test.base, x, test.out)
                }

        }
}

func numAllocations(f func()) int {
        memstats := new(runtime.MemStats)
        runtime.ReadMemStats(memstats)
        n0 := memstats.Mallocs
        f()
        runtime.ReadMemStats(memstats)
        return int(memstats.Mallocs - n0)
}

/* This test relies on escape analysis which gccgo does not yet do.

var globalBuf [64]byte

func TestAppendUintDoesntAllocate(t *testing.T) {
        n := numAllocations(func() {
                var buf [64]byte
                AppendInt(buf[:0], 123, 10)
        })
        want := 1 // TODO(bradfitz): this might be 0, once escape analysis is better
        if n != want {
                t.Errorf("with local buffer, did %d allocations, want %d", n, want)
        }
        n = numAllocations(func() {
                AppendInt(globalBuf[:0], 123, 10)
        })
        if n != 0 {
                t.Errorf("with reused buffer, did %d allocations, want 0", n)
        }
}

*/

func BenchmarkFormatInt(b *testing.B) {
        for i := 0; i < b.N; i++ {
                for _, test := range itob64tests {
                        FormatInt(test.in, test.base)
                }
        }
}

func BenchmarkAppendInt(b *testing.B) {
        dst := make([]byte, 0, 30)
        for i := 0; i < b.N; i++ {
                for _, test := range itob64tests {
                        AppendInt(dst, test.in, test.base)
                }
        }
}

func BenchmarkFormatUint(b *testing.B) {
        for i := 0; i < b.N; i++ {
                for _, test := range uitob64tests {
                        FormatUint(test.in, test.base)
                }
        }
}

func BenchmarkAppendUint(b *testing.B) {
        dst := make([]byte, 0, 30)
        for i := 0; i < b.N; i++ {
                for _, test := range uitob64tests {
                        AppendUint(dst, test.in, test.base)
                }
        }
}

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.