diff options
author | Rob Pike <r@golang.org> | 2009-06-09 09:53:44 -0700 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2009-06-09 09:53:44 -0700 |
commit | 7249ea4df2b4f12a4e7ed446f270cea87e4ffd34 (patch) | |
tree | 7032a11d0cac2ae4d3e90f7a189b575b5a50f848 /src/lib/datafmt/datafmt_test.go | |
parent | acf6ef7a82b3fe61516a1bac4563706552bdf078 (diff) | |
download | golang-7249ea4df2b4f12a4e7ed446f270cea87e4ffd34.tar.gz |
mv src/lib to src/pkg
tests: all.bash passes, gobuild still works, godoc still works.
R=rsc
OCL=30096
CL=30102
Diffstat (limited to 'src/lib/datafmt/datafmt_test.go')
-rw-r--r-- | src/lib/datafmt/datafmt_test.go | 375 |
1 files changed, 0 insertions, 375 deletions
diff --git a/src/lib/datafmt/datafmt_test.go b/src/lib/datafmt/datafmt_test.go deleted file mode 100644 index 788c013c6..000000000 --- a/src/lib/datafmt/datafmt_test.go +++ /dev/null @@ -1,375 +0,0 @@ -// 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 datafmt - -import ( - "fmt"; - "datafmt"; - "io"; - "os"; - "testing"; -) - - -func parse(t *testing.T, form string, fmap FormatterMap) Format { - f, err := Parse(io.StringBytes(form), fmap); - if err != nil { - t.Errorf("Parse(%s): %v", form, err); - return nil; - } - return f; -} - - -func verify(t *testing.T, f Format, expected string, args ...) { - if f == nil { - return; // allow other tests to run - } - result := f.Sprint(args); - if result != expected { - t.Errorf( - "result : `%s`\nexpected: `%s`\n\n", - result, expected - ) - } -} - - -func formatter(s *State, value interface{}, rule_name string) bool { - switch rule_name { - case "/": - fmt.Fprintf(s, "%d %d %d", s.Pos().Line, s.LinePos().Column, s.Pos().Column); - return true; - case "blank": - s.Write([]byte{' '}); - return true; - case "int": - if value.(int) & 1 == 0 { - fmt.Fprint(s, "even "); - } else { - fmt.Fprint(s, "odd "); - } - return true; - case "nil": - return false; - case "testing.T": - s.Write(io.StringBytes("testing.T")); - return true; - } - panic("unreachable"); - return false; -} - - -func TestCustomFormatters(t *testing.T) { - fmap0 := FormatterMap{ "/": formatter }; - fmap1 := FormatterMap{ "int": formatter, "blank": formatter, "nil": formatter }; - fmap2 := FormatterMap{ "testing.T": formatter }; - - f := parse(t, `int=`, fmap0); - verify(t, f, ``, 1, 2, 3); - - f = parse(t, `int="#"`, nil); - verify(t, f, `###`, 1, 2, 3); - - f = parse(t, `int="#";string="%s"`, fmap0); - verify(t, f, "#1 0 1#1 0 7#1 0 13\n2 0 0foo2 0 8\n", 1, 2, 3, "\n", "foo", "\n"); - - f = parse(t, ``, fmap1); - verify(t, f, `even odd even odd `, 0, 1, 2, 3); - - f = parse(t, `/ =@:blank; float="#"`, fmap1); - verify(t, f, `# # #`, 0.0, 1.0, 2.0); - - f = parse(t, `float=@:nil`, fmap1); - verify(t, f, ``, 0.0, 1.0, 2.0); - - f = parse(t, `testing "testing"; ptr=*`, fmap2); - verify(t, f, `testing.T`, t); - - // TODO needs more tests -} - - -// ---------------------------------------------------------------------------- -// Formatting of basic and simple composite types - -func check(t *testing.T, form, expected string, args ...) { - f := parse(t, form, nil); - if f == nil { - return; // allow other tests to run - } - result := f.Sprint(args); - if result != expected { - t.Errorf( - "format : %s\nresult : `%s`\nexpected: `%s`\n\n", - form, result, expected - ) - } -} - - -func TestBasicTypes(t *testing.T) { - check(t, ``, ``); - check(t, `bool=":%v"`, `:true:false`, true, false); - check(t, `int="%b %d %o 0x%x"`, `101010 42 52 0x2a`, 42); - - check(t, `int="%"`, `%`, 42); - check(t, `int="%%"`, `%`, 42); - check(t, `int="**%%**"`, `**%**`, 42); - check(t, `int="%%%%%%"`, `%%%`, 42); - check(t, `int="%%%d%%"`, `%42%`, 42); - - const i = -42; - const is = `-42`; - check(t, `int ="%d"`, is, i); - check(t, `int8 ="%d"`, is, int8(i)); - check(t, `int16="%d"`, is, int16(i)); - check(t, `int32="%d"`, is, int32(i)); - check(t, `int64="%d"`, is, int64(i)); - - const u = 42; - const us = `42`; - check(t, `uint ="%d"`, us, uint(u)); - check(t, `uint8 ="%d"`, us, uint8(u)); - check(t, `uint16="%d"`, us, uint16(u)); - check(t, `uint32="%d"`, us, uint32(u)); - check(t, `uint64="%d"`, us, uint64(u)); - - const f = 3.141592; - const fs = `3.141592`; - check(t, `float ="%g"`, fs, f); - check(t, `float32="%g"`, fs, float32(f)); - check(t, `float64="%g"`, fs, float64(f)); -} - - -func TestArrayTypes(t *testing.T) { - var a0 [10]int; - check(t, `array="array";`, `array`, a0); - - a1 := [...]int{1, 2, 3}; - check(t, `array="array";`, `array`, a1); - check(t, `array={*}; int="%d";`, `123`, a1); - check(t, `array={* / ", "}; int="%d";`, `1, 2, 3`, a1); - check(t, `array={* / *}; int="%d";`, `12233`, a1); - - a2 := []interface{}{42, "foo", 3.14}; - check(t, `array={* / ", "}; interface=*; string="bar"; default="%v";`, `42, bar, 3.14`, a2); -} - - -func TestChanTypes(t *testing.T) { - var c0 chan int; - check(t, `chan="chan"`, `chan`, c0); - - c1 := make(chan int); - go func(){ c1 <- 42 }(); - check(t, `chan="chan"`, `chan`, c1); - // check(t, `chan=*`, `42`, c1); // reflection support for chans incomplete -} - - -func TestFuncTypes(t *testing.T) { - var f0 func() int; - check(t, `func="func"`, `func`, f0); - - f1 := func() int { return 42; }; - check(t, `func="func"`, `func`, f1); - // check(t, `func=*`, `42`, f1); // reflection support for funcs incomplete -} - - -func TestInterfaceTypes(t *testing.T) { - var i0 interface{}; - check(t, `interface="interface"`, `interface`, i0); - - i0 = "foo"; - check(t, `interface="interface"`, `interface`, i0); - check(t, `interface=*; string="%s"`, `foo`, i0); -} - - -func TestMapTypes(t *testing.T) { - var m0 map[string]int; - check(t, `map="map"`, `map`, m0); - - m1 := map[string]int{}; - check(t, `map="map"`, `map`, m1); - // check(t, `map=*`, ``, m1); // reflection support for maps incomplete -} - - -func TestPointerTypes(t *testing.T) { - var p0 *int; - check(t, `ptr="ptr"`, `ptr`, p0); - check(t, `ptr=*`, ``, p0); - check(t, `ptr=*|"nil"`, `nil`, p0); - - x := 99991; - p1 := &x; - check(t, `ptr="ptr"`, `ptr`, p1); - check(t, `ptr=*; int="%d"`, `99991`, p1); -} - - -func TestDefaultRule(t *testing.T) { - check(t, `default="%v"`, `42foo3.14`, 42, "foo", 3.14); - check(t, `default="%v"; int="%x"`, `abcdef`, 10, 11, 12, 13, 14, 15); - check(t, `default="%v"; int="%x"`, `ab**ef`, 10, 11, "**", 14, 15); - check(t, `default="%x"; int=@:default`, `abcdef`, 10, 11, 12, 13, 14, 15); -} - - -func TestGlobalSeparatorRule(t *testing.T) { - check(t, `int="%d"; / ="-"`, `1-2-3-4`, 1, 2, 3, 4); - check(t, `int="%x%x"; / ="*"`, `aa*aa`, 10, 10); -} - - -// ---------------------------------------------------------------------------- -// Formatting of a struct - -type T1 struct { - a int; -} - -const F1 = - `datafmt "datafmt";` - `int = "%d";` - `datafmt.T1 = "<" a ">";` - -func TestStruct1(t *testing.T) { - check(t, F1, "<42>", T1{42}); -} - - -// ---------------------------------------------------------------------------- -// Formatting of a struct with an optional field (ptr) - -type T2 struct { - s string; - p *T1; -} - -const F2a = - F1 + - `string = "%s";` - `ptr = *;` - `datafmt.T2 = s ["-" p "-"];` - -const F2b = - F1 + - `string = "%s";` - `ptr = *;` - `datafmt.T2 = s ("-" p "-" | "empty");`; - -func TestStruct2(t *testing.T) { - check(t, F2a, "foo", T2{"foo", nil}); - check(t, F2a, "bar-<17>-", T2{"bar", &T1{17}}); - check(t, F2b, "fooempty", T2{"foo", nil}); -} - - -// ---------------------------------------------------------------------------- -// Formatting of a struct with a repetitive field (slice) - -type T3 struct { - s string; - a []int; -} - -const F3a = - `datafmt "datafmt";` - `default = "%v";` - `array = *;` - `datafmt.T3 = s {" " a a / ","};` - -const F3b = - `datafmt "datafmt";` - `int = "%d";` - `string = "%s";` - `array = *;` - `nil = ;` - `empty = *:nil;` - `datafmt.T3 = s [a:empty ": " {a / "-"}]` - -func TestStruct3(t *testing.T) { - check(t, F3a, "foo", T3{"foo", nil}); - check(t, F3a, "foo 00, 11, 22", T3{"foo", []int{0, 1, 2}}); - check(t, F3b, "bar", T3{"bar", nil}); - check(t, F3b, "bal: 2-3-5", T3{"bal", []int{2, 3, 5}}); -} - - -// ---------------------------------------------------------------------------- -// Formatting of a struct with alternative field - -type T4 struct { - x *int; - a []int; -} - -const F4a = - `datafmt "datafmt";` - `int = "%d";` - `ptr = *;` - `array = *;` - `nil = ;` - `empty = *:nil;` - `datafmt.T4 = "<" (x:empty x | "-") ">" ` - -const F4b = - `datafmt "datafmt";` - `int = "%d";` - `ptr = *;` - `array = *;` - `nil = ;` - `empty = *:nil;` - `datafmt.T4 = "<" (a:empty {a / ", "} | "-") ">" ` - -func TestStruct4(t *testing.T) { - x := 7; - check(t, F4a, "<->", T4{nil, nil}); - check(t, F4a, "<7>", T4{&x, nil}); - check(t, F4b, "<->", T4{nil, nil}); - check(t, F4b, "<2, 3, 7>", T4{nil, []int{2, 3, 7}}); -} - - -// ---------------------------------------------------------------------------- -// Formatting a struct (documentation example) - -type Point struct { - name string; - x, y int; -} - -const FPoint = - `datafmt "datafmt";` - `int = "%d";` - `hexInt = "0x%x";` - `string = "---%s---";` - `datafmt.Point = name "{" x ", " y:hexInt "}";` - -func TestStructPoint(t *testing.T) { - p := Point{"foo", 3, 15}; - check(t, FPoint, "---foo---{3, 0xf}", p); -} - - -// ---------------------------------------------------------------------------- -// Formatting a slice (documentation example) - -const FSlice = - `int = "%b";` - `array = { * / ", " }` - -func TestSlice(t *testing.T) { - check(t, FSlice, "10, 11, 101, 111", []int{2, 3, 5, 7}); -} - - -// TODO add more tests |