summaryrefslogtreecommitdiff
path: root/src/pkg/fmt/scan_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/fmt/scan_test.go')
-rw-r--r--src/pkg/fmt/scan_test.go150
1 files changed, 132 insertions, 18 deletions
diff --git a/src/pkg/fmt/scan_test.go b/src/pkg/fmt/scan_test.go
index 19bb6d2a5..ca51cf0a2 100644
--- a/src/pkg/fmt/scan_test.go
+++ b/src/pkg/fmt/scan_test.go
@@ -19,24 +19,58 @@ type ScanTest struct {
out interface{}
}
-var boolVal bool
-var intVal int
-var int8Val int8
-var int16Val int16
-var int32Val int32
-var int64Val int64
-var uintVal uint
-var uint8Val uint8
-var uint16Val uint16
-var uint32Val uint32
-var uint64Val uint64
-var floatVal float
-var float32Val float32
-var float64Val float64
-var stringVal string
-var complexVal complex
-var complex64Val complex64
-var complex128Val complex128
+type ScanfTest struct {
+ format string
+ text string
+ in interface{}
+ out interface{}
+}
+
+type (
+ renamedInt int
+ renamedInt8 int8
+ renamedInt16 int16
+ renamedInt32 int32
+ renamedInt64 int64
+ renamedUint uint
+ renamedUint8 uint8
+ renamedUint16 uint16
+ renamedUint32 uint32
+ renamedUint64 uint64
+ renamedUintptr uintptr
+)
+
+var (
+ boolVal bool
+ intVal int
+ int8Val int8
+ int16Val int16
+ int32Val int32
+ int64Val int64
+ uintVal uint
+ uint8Val uint8
+ uint16Val uint16
+ uint32Val uint32
+ uint64Val uint64
+ floatVal float
+ float32Val float32
+ float64Val float64
+ stringVal string
+ complexVal complex
+ complex64Val complex64
+ complex128Val complex128
+ renamedIntVal renamedInt
+ renamedInt8Val renamedInt8
+ renamedInt16Val renamedInt16
+ renamedInt32Val renamedInt32
+ renamedInt64Val renamedInt64
+ renamedUintVal renamedUint
+ renamedUint8Val renamedUint8
+ renamedUint16Val renamedUint16
+ renamedUint32Val renamedUint32
+ renamedUint64Val renamedUint64
+ renamedUintptrVal renamedUintptr
+)
// Xs accepts any non-empty run of x's.
var xPat = testing.MustCompile("x+")
@@ -92,10 +126,66 @@ var scanTests = []ScanTest{
ScanTest{"-3.45e1-3i\n", &complex64Val, complex64(-3.45e1 - 3i)},
ScanTest{"-.45e1-1e2i\n", &complex128Val, complex128(-.45e1 - 100i)},
+ // Renamed types
+ ScanTest{"101\n", &renamedIntVal, renamedInt(101)},
+ ScanTest{"102\n", &renamedIntVal, renamedInt(102)},
+ ScanTest{"103\n", &renamedUintVal, renamedUint(103)},
+ ScanTest{"104\n", &renamedUintVal, renamedUint(104)},
+ ScanTest{"105\n", &renamedInt8Val, renamedInt8(105)},
+ ScanTest{"106\n", &renamedInt16Val, renamedInt16(106)},
+ ScanTest{"107\n", &renamedInt32Val, renamedInt32(107)},
+ ScanTest{"108\n", &renamedInt64Val, renamedInt64(108)},
+ ScanTest{"109\n", &renamedUint8Val, renamedUint8(109)},
+ ScanTest{"110\n", &renamedUint16Val, renamedUint16(110)},
+ ScanTest{"111\n", &renamedUint32Val, renamedUint32(111)},
+ ScanTest{"112\n", &renamedUint64Val, renamedUint64(112)},
+ ScanTest{"113\n", &renamedUintptrVal, renamedUintptr(113)},
+
// Custom scanner.
ScanTest{" xxx ", &xVal, Xs("xxx")},
}
+var scanfTests = []ScanfTest{
+ ScanfTest{"%v", "FALSE\n", &boolVal, false},
+ ScanfTest{"%t", "true\n", &boolVal, true},
+ ScanfTest{"%v", "-71\n", &intVal, -71},
+ ScanfTest{"%d", "72\n", &intVal, 72},
+ ScanfTest{"%d", "73\n", &int8Val, int8(73)},
+ ScanfTest{"%d", "-74\n", &int16Val, int16(-74)},
+ ScanfTest{"%d", "75\n", &int32Val, int32(75)},
+ ScanfTest{"%d", "76\n", &int64Val, int64(76)},
+ ScanfTest{"%b", "1001001\n", &intVal, 73},
+ ScanfTest{"%o", "075\n", &intVal, 075},
+ ScanfTest{"%x", "a75\n", &intVal, 0xa75},
+ ScanfTest{"%v", "71\n", &uintVal, uint(71)},
+ ScanfTest{"%d", "72\n", &uintVal, uint(72)},
+ ScanfTest{"%d", "73\n", &uint8Val, uint8(73)},
+ ScanfTest{"%d", "74\n", &uint16Val, uint16(74)},
+ ScanfTest{"%d", "75\n", &uint32Val, uint32(75)},
+ ScanfTest{"%d", "76\n", &uint64Val, uint64(76)},
+ ScanfTest{"%b", "1001001\n", &uintVal, uint(73)},
+ ScanfTest{"%o", "075\n", &uintVal, uint(075)},
+ ScanfTest{"%x", "a75\n", &uintVal, uint(0xa75)},
+ ScanfTest{"%x", "A75\n", &uintVal, uint(0xa75)},
+
+ // Renamed types
+ ScanfTest{"%v", "101\n", &renamedIntVal, renamedInt(101)},
+ ScanfTest{"%d", "102\n", &renamedIntVal, renamedInt(102)},
+ ScanfTest{"%v", "103\n", &renamedUintVal, renamedUint(103)},
+ ScanfTest{"%d", "104\n", &renamedUintVal, renamedUint(104)},
+ ScanfTest{"%d", "105\n", &renamedInt8Val, renamedInt8(105)},
+ ScanfTest{"%d", "106\n", &renamedInt16Val, renamedInt16(106)},
+ ScanfTest{"%d", "107\n", &renamedInt32Val, renamedInt32(107)},
+ ScanfTest{"%d", "108\n", &renamedInt64Val, renamedInt64(108)},
+ ScanfTest{"%d", "109\n", &renamedUint8Val, renamedUint8(109)},
+ ScanfTest{"%d", "110\n", &renamedUint16Val, renamedUint16(110)},
+ ScanfTest{"%d", "111\n", &renamedUint32Val, renamedUint32(111)},
+ ScanfTest{"%d", "112\n", &renamedUint64Val, renamedUint64(112)},
+ ScanfTest{"%d", "113\n", &renamedUintptrVal, renamedUintptr(113)},
+
+ ScanfTest{"%x", "FFFFFFFF\n", &uint32Val, uint32(0xFFFFFFFF)},
+}
+
var overflowTests = []ScanTest{
ScanTest{"128", &int8Val, 0},
ScanTest{"32768", &int16Val, 0},
@@ -142,6 +232,30 @@ func TestScanln(t *testing.T) {
testScan(t, Fscanln)
}
+func TestScanf(t *testing.T) {
+ for _, test := range scanfTests {
+ r := strings.NewReader(test.text)
+ n, err := XXXFscanf(r, test.format, test.in)
+ if err != nil {
+ t.Errorf("got error scanning (%q, %q): %s", test.format, test.text, err)
+ continue
+ }
+ if n != 1 {
+ t.Errorf("count error on entry (%q, %q): got %d", test.format, test.text, n)
+ continue
+ }
+ // The incoming value may be a pointer
+ v := reflect.NewValue(test.in)
+ if p, ok := v.(*reflect.PtrValue); ok {
+ v = p.Elem()
+ }
+ val := v.Interface()
+ if !reflect.DeepEqual(val, test.out) {
+ t.Errorf("scanning (%q, %q): expected %v got %v, type %T", test.format, test.text, test.out, val, val)
+ }
+ }
+}
+
func TestScanOverflow(t *testing.T) {
// different machines and different types report errors with different strings.
re := testing.MustCompile("overflow|too large|out of range|not representable")