// 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 }