mirror of
https://github.com/golang/go
synced 2024-11-26 17:46:57 -07:00
d76f095750
- format-driven pretty printing now handles all of Go code - better error handling R=r OCL=28370 CL=28372
131 lines
2.7 KiB
Go
131 lines
2.7 KiB
Go
// 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 format
|
|
|
|
import (
|
|
"format";
|
|
"testing";
|
|
)
|
|
|
|
|
|
func check(t *testing.T, form, expected string, args ...) {
|
|
result := format.ParseOrDie(form, nil).Sprint(args);
|
|
if result != expected {
|
|
t.Errorf(
|
|
"format : %s\nresult : `%s`\nexpected: `%s`\n\n",
|
|
form, result, expected
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Syntax
|
|
|
|
func TestA(t *testing.T) {
|
|
// TODO fill this in
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// - formatting of basic types
|
|
|
|
func Test0(t *testing.T) {
|
|
check(t, `bool = "%v"`, "false", false);
|
|
check(t, `int = "%b %d %o 0x%x"`, "101010 42 52 0x2a", 42);
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// - default formatting of basic type int
|
|
// - formatting of a struct
|
|
|
|
type T1 struct {
|
|
a int;
|
|
}
|
|
|
|
const F1 =
|
|
`format.T1 = "<" a ">";`
|
|
|
|
func Test1(t *testing.T) {
|
|
check(t, F1, "<42>", T1{42});
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// - formatting of a struct with an optional field (pointer)
|
|
// - default formatting for pointers
|
|
|
|
type T2 struct {
|
|
s string;
|
|
p *T1;
|
|
}
|
|
|
|
const F2a =
|
|
F1 +
|
|
`pointer = *;`
|
|
`format.T2 = s ["-" p "-"];`
|
|
|
|
const F2b =
|
|
F1 +
|
|
`format.T2 = s ("-" p "-" | "empty");`;
|
|
|
|
func Test2(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 =
|
|
`format.T3 = s {" " a a / ","};`
|
|
|
|
const F3b =
|
|
`nil = ;`
|
|
`empty = *:nil;`
|
|
`format.T3 = s [a:empty ": " {a / "-"}]`
|
|
|
|
func Test3(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 =
|
|
`nil = ;`
|
|
`empty = *:nil;`
|
|
`format.T4 = "<" (x:empty x | "-") ">" `
|
|
|
|
const F4b =
|
|
`nil = ;`
|
|
`empty = *:nil;`
|
|
`format.T4 = "<" (a:empty {a / ", "} | "-") ">" `
|
|
|
|
func Test4(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}});
|
|
}
|