blob: e0dc5b04be39279f212c0b1cfb740c1e617c444d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* https://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 utils
import (
"testing"
"github.com/stretchr/testify/assert"
)
type _TestBoxAnythingTestBoxer struct {
}
func (_TestBoxAnythingTestBoxer) Box(options ...func(*BoxOptions)) AsciiBox {
return AsciiBox{data: "i did it"}
}
type _TestBoxAnythingTestBoxerStringer struct {
}
func (_TestBoxAnythingTestBoxerStringer) String() string {
return "i did it"
}
type _TestBoxAnythingTestBoxerAnything struct {
someField string
someInt int
}
func TestBoxAnything(t *testing.T) {
type args struct {
anything any
options []func(*BoxOptions)
}
tests := []struct {
name string
args args
want AsciiBox
}{
{
name: "test nil",
want: AsciiBox{asciiBoxWriter: AsciiBoxWriterDefault.(*asciiBoxWriter)},
},
{
name: "asciiBoxer",
args: args{
anything: _TestBoxAnythingTestBoxer{},
},
want: AsciiBox{data: "i did it"},
},
{
name: "asciiBoxer as interface",
args: args{
anything: func() AsciiBoxer {
var a AsciiBoxer
return a
}(),
},
want: AsciiBox{asciiBoxWriter: AsciiBoxWriterDefault.(*asciiBoxWriter)},
},
{
name: "test bool",
args: args{
anything: true,
options: []func(*BoxOptions){
WithAsciiBoxName("exampleBool"),
},
},
want: asciiBoxForTest(`
╔═exampleBool╗
║ b1 true ║
╚════════════╝`[1:]),
},
{
name: "test int",
args: args{
anything: 1,
options: []func(*BoxOptions){
WithAsciiBoxName("exampleInt"),
},
},
want: asciiBoxForTest(`
╔═exampleInt═════════╗
║0x0000000000000001 1║
╚════════════════════╝`[1:]),
},
{
name: "test int 123123123",
args: args{
anything: 123123123,
options: []func(*BoxOptions){
WithAsciiBoxName("exampleInt"),
},
},
want: asciiBoxForTest(`
╔═exampleInt═════════════════╗
║0x000000000756b5b3 123123123║
╚════════════════════════════╝`[1:]),
},
{
name: "test []byte",
args: args{
anything: []byte{1, 2, 3},
options: []func(*BoxOptions){
WithAsciiBoxName("example byte[]"),
},
},
want: asciiBoxForTest(`
╔═example byte[]╗
║ 0|01 '.' ║
║ 1|02 '.' ║
║ 2|03 '.' ║
╚═══════════════╝`[1:]),
},
{
name: "box string",
args: args{
anything: "asdasdasdasdasd",
options: []func(*BoxOptions){
WithAsciiBoxName("example string"),
},
},
want: asciiBoxForTest(`
╔═example string╗
║asdasdasdasdasd║
╚═══════════════╝`[1:]),
},
{
name: "box stringer",
args: args{
anything: _TestBoxAnythingTestBoxerStringer{},
options: []func(*BoxOptions){
WithAsciiBoxName("example stringer"),
},
},
want: asciiBoxForTest(`
╔═example stringer╗
║ i did it ║
╚═════════════════╝`[1:]),
},
{
name: "anything struct",
args: args{
anything: _TestBoxAnythingTestBoxerAnything{
someField: "a field value",
someInt: 234243,
},
options: []func(*BoxOptions){
WithAsciiBoxName("any struct"),
},
},
want: asciiBoxForTest(`
╔═any struct═══════════╗
║{a field value 234243}║
╚══════════════════════╝`[1:]),
},
{
name: "anything struct pointer",
args: args{
anything: &_TestBoxAnythingTestBoxerAnything{
someField: "a field value",
someInt: 234243,
},
options: []func(*BoxOptions){
WithAsciiBoxName("any struct"),
},
},
want: asciiBoxForTest(`
╔═any struct═══════════╗
║{a field value 234243}║
╚══════════════════════╝`[1:]),
},
{
name: "int pointer",
args: args{
anything: func() *int {
a := 13
return &a
}(),
options: []func(*BoxOptions){
WithAsciiBoxName("int pointer"),
},
},
want: asciiBoxForTest(`
╔═int pointer═════════╗
║0x000000000000000d 13║
╚═════════════════════╝`[1:]),
},
{
name: "array",
args: args{
anything: []any{1, "1,2,3", 2, _TestBoxAnythingTestBoxerAnything{
someField: "a field value",
someInt: 234243,
}, &_TestBoxAnythingTestBoxerAnything{
someField: "a field value",
someInt: 234243,
}},
options: []func(*BoxOptions){
WithAsciiBoxName("array"),
},
},
want: asciiBoxForTest(`
╔═array══════════════════╗
║╔════════════════════╗ ║
║║0x0000000000000001 1║ ║
║╚════════════════════╝ ║
║╔═════╗ ║
║║1,2,3║ ║
║╚═════╝ ║
║╔════════════════════╗ ║
║║0x0000000000000002 2║ ║
║╚════════════════════╝ ║
║╔══════════════════════╗║
║║{a field value 234243}║║
║╚══════════════════════╝║
║╔══════════════════════╗║
║║{a field value 234243}║║
║╚══════════════════════╝║
╚════════════════════════╝`[1:]),
},
{
name: "slice",
args: args{
anything: []any{1, "1,2,3", 2, _TestBoxAnythingTestBoxerAnything{
someField: "a field value",
someInt: 234243,
}, &_TestBoxAnythingTestBoxerAnything{
someField: "a field value",
someInt: 234243,
}}[:],
options: []func(*BoxOptions){
WithAsciiBoxName("array"),
},
},
want: asciiBoxForTest(`
╔═array══════════════════╗
║╔════════════════════╗ ║
║║0x0000000000000001 1║ ║
║╚════════════════════╝ ║
║╔═════╗ ║
║║1,2,3║ ║
║╚═════╝ ║
║╔════════════════════╗ ║
║║0x0000000000000002 2║ ║
║╚════════════════════╝ ║
║╔══════════════════════╗║
║║{a field value 234243}║║
║╚══════════════════════╝║
║╔══════════════════════╗║
║║{a field value 234243}║║
║╚══════════════════════╝║
╚════════════════════════╝`[1:]),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := BoxAnything(tt.args.anything, tt.args.options...); !assert.Equal(t, tt.want, got) {
t.Errorf("BoxAnything() = '\n%v'\n, want '\n%v'", got, tt.want)
}
})
}
}
func TestBoxedDump(t *testing.T) {
type args struct {
data []byte
options []func(*BoxOptions)
}
tests := []struct {
name string
args args
want AsciiBox
}{
{
name: "Test Dump 1",
args: args{
data: []byte("1234567890abcdefghijklmnopqrstuvwxyz\3231234567890abcdefghijklmnopqrstuvwxyz\323aa1234567890abcdefghijklmnopqrstuvwxyz\3231234567890abcdefghijklmnopqrstuvwxyz\323aab"),
options: []func(*BoxOptions){
WithAsciiBoxName("super nice data"),
},
},
want: asciiBoxForTest(`
╔═super nice data══════════════════════════════╗
║000|31 32 33 34 35 36 37 38 39 30 '1234567890'║
║010|61 62 63 64 65 66 67 68 69 6a 'abcdefghij'║
║020|6b 6c 6d 6e 6f 70 71 72 73 74 'klmnopqrst'║
║030|75 76 77 78 79 7a d3 31 32 33 'uvwxyz.123'║
║040|34 35 36 37 38 39 30 61 62 63 '4567890abc'║
║050|64 65 66 67 68 69 6a 6b 6c 6d 'defghijklm'║
║060|6e 6f 70 71 72 73 74 75 76 77 'nopqrstuvw'║
║070|78 79 7a d3 61 61 31 32 33 34 'xyz.aa1234'║
║080|35 36 37 38 39 30 61 62 63 64 '567890abcd'║
║090|65 66 67 68 69 6a 6b 6c 6d 6e 'efghijklmn'║
║100|6f 70 71 72 73 74 75 76 77 78 'opqrstuvwx'║
║110|79 7a d3 31 32 33 34 35 36 37 'yz.1234567'║
║120|38 39 30 61 62 63 64 65 66 67 '890abcdefg'║
║130|68 69 6a 6b 6c 6d 6e 6f 70 71 'hijklmnopq'║
║140|72 73 74 75 76 77 78 79 7a d3 'rstuvwxyz.'║
║150|61 61 62 'aab '║
╚══════════════════════════════════════════════╝`[1:]),
},
{
name: "Test Dump 2",
args: args{
data: []byte("1234567890abcdefghijklmnopqrstuvwxyz\3231234567890abcdefghijklmnopqrstuvwxyz\323aa1234567890abcdefghijklmnopqrstuvwxyz\3231234567890abcdefghijklmnopqrstuvwxyz\323aab"),
options: []func(*BoxOptions){
WithAsciiBoxName("super nice data"),
WithAsciiBoxCharWidth(110),
},
},
want: asciiBoxForTest(`
╔═super nice data════════════════════════════════════════════════════════════════════════════════════════════╗
║ 000|31 32 33 34 35 36 37 38 39 30 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f '1234567890abcdefghijklmno' ║
║ 025|70 71 72 73 74 75 76 77 78 79 7a d3 31 32 33 34 35 36 37 38 39 30 61 62 63 'pqrstuvwxyz.1234567890abc' ║
║ 050|64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a d3 61 'defghijklmnopqrstuvwxyz.a' ║
║ 075|61 31 32 33 34 35 36 37 38 39 30 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 'a1234567890abcdefghijklmn' ║
║ 100|6f 70 71 72 73 74 75 76 77 78 79 7a d3 31 32 33 34 35 36 37 38 39 30 61 62 'opqrstuvwxyz.1234567890ab' ║
║ 125|63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a d3 'cdefghijklmnopqrstuvwxyz.' ║
║ 150|61 61 62 'aab ' ║
╚════════════════════════════════════════════════════════════════════════════════════════════════════════════╝`[1:]),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := BoxedDump(tt.args.data, tt.args.options...); !assert.Equal(t, tt.want, got) {
t.Errorf("Dump() = \n%v\n, want \n%v\n", got, tt.want)
}
})
}
}
func TestDumpAnything(t *testing.T) {
t.Skip("That seems to be platform dependent, so not sure how to fix that")
type args struct {
anything any
options []func(*BoxOptions)
}
tests := []struct {
name string
args args
want string
}{
{
name: "Random struct",
args: args{
anything: struct {
A string
B string
C string
D struct {
E string
F string
}
}{A: "a", B: "b", C: "c", D: struct {
E string
F string
}{
E: "e",
F: "f",
}},
},
want: `
000|25 ff 81 03 01 02 ff 82 00 01 '%.........'
010|04 01 01 41 01 0c 00 01 01 42 '...A.....B'
020|01 0c 00 01 01 43 01 0c 00 01 '.....C....'
030|01 44 01 ff 84 00 00 00 37 ff '.D......7.'
040|83 03 01 01 1d 73 74 72 75 63 '.....struc'
050|74 20 7b 20 45 20 73 74 72 69 't { E stri'
060|6e 67 3b 20 46 20 73 74 72 69 'ng; F stri'
070|6e 67 20 7d 01 ff 84 00 01 02 'ng }......'
080|01 01 45 01 0c 00 01 01 46 01 '..E.....F.'
090|0c 00 00 00 14 ff 82 01 01 61 '.........a'
100|01 01 62 01 01 63 01 01 01 65 '..b..c...e'
110|01 01 66 00 00 '..f.. '`[1:],
},
{
name: "unexported struct gob error",
args: args{
anything: struct {
a string
}{a: "a"},
},
want: "<undumpable>",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := DumpAnything(tt.args.anything, tt.args.options...); !assert.Equal(t, tt.want, got) {
t.Errorf("Dump() = \n%v\n, want \n%v\n", got, tt.want)
}
})
}
}
func TestBoxedDumpAnything(t *testing.T) {
type args struct {
anything any
options []func(*BoxOptions)
}
tests := []struct {
name string
args args
want AsciiBox
}{
{
name: "dump it",
want: asciiBoxForTest(`
╔════════════╗
║<undumpable>║
╚════════════╝`[1:]),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := BoxedDumpAnything(tt.args.anything, tt.args.options...); !assert.Equal(t, tt.want, got) {
t.Errorf("BoxedDumpAnything() = \n%v\n, want \n%v", got, tt.want)
}
})
}
}