| // Copyright 2016 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package pretty |
| |
| import ( |
| "fmt" |
| "strings" |
| "testing" |
| ) |
| |
| type S struct { |
| X int |
| Y bool |
| z *string |
| } |
| |
| func TestSprint(t *testing.T) { |
| Indent = "~" |
| i := 17 |
| |
| for _, test := range []struct { |
| value interface{} |
| want string |
| }{ |
| // primitives and pointer |
| {nil, "nil"}, |
| {3, "3"}, |
| {9.8, "9.8"}, |
| {true, "true"}, |
| {"foo", `"foo"`}, |
| {&i, "&17"}, |
| // array and slice |
| {[3]int{1, 2, 3}, "[3]int{\n~1,\n~2,\n~3,\n}"}, |
| {[]int{1, 2, 3}, "[]int{\n~1,\n~2,\n~3,\n}"}, |
| {[]int{}, "[]int{}"}, |
| {[]string{"foo"}, "[]string{\n~\"foo\",\n}"}, |
| // map |
| {map[int]bool{}, "map[int]bool{}"}, |
| {map[int]bool{1: true, 2: false, 3: true}, |
| "map[int]bool{\n~1: true,\n~3: true,\n}"}, |
| // struct |
| {S{}, "pretty.S{\n}"}, |
| {S{3, true, ptr("foo")}, |
| "pretty.S{\n~X: 3,\n~Y: true,\n~z: &\"foo\",\n}"}, |
| // interface |
| {[]interface{}{&i}, "[]interface {}{\n~&17,\n}"}, |
| // nesting |
| {[]S{{1, false, ptr("a")}, {2, true, ptr("b")}}, |
| `[]pretty.S{ |
| ~pretty.S{ |
| ~~X: 1, |
| ~~z: &"a", |
| ~}, |
| ~pretty.S{ |
| ~~X: 2, |
| ~~Y: true, |
| ~~z: &"b", |
| ~}, |
| }`}, |
| } { |
| got := fmt.Sprintf("%v", Value(test.value)) |
| if got != test.want { |
| t.Errorf("%v: got:\n%q\nwant:\n%q", test.value, got, test.want) |
| } |
| } |
| } |
| |
| func TestWithDefaults(t *testing.T) { |
| Indent = "~" |
| for _, test := range []struct { |
| value interface{} |
| want string |
| }{ |
| {map[int]bool{1: true, 2: false, 3: true}, |
| "map[int]bool{\n~1: true,\n~2: false,\n~3: true,\n}"}, |
| {S{}, "pretty.S{\n~X: 0,\n~Y: false,\n~z: nil,\n}"}, |
| } { |
| got := fmt.Sprintf("%+v", Value(test.value)) |
| if got != test.want { |
| t.Errorf("%v: got:\n%q\nwant:\n%q", test.value, got, test.want) |
| } |
| } |
| } |
| |
| func TestBadVerb(t *testing.T) { |
| got := fmt.Sprintf("%d", Value(8)) |
| want := "%!d(" |
| if !strings.HasPrefix(got, want) { |
| t.Errorf("got %q, want prefix %q", got, want) |
| } |
| } |
| |
| func ptr(s string) *string { return &s } |