gonum.org/v1/gonum@v0.14.0/mat/format_test.go (about) 1 // Copyright ©2013 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package mat 6 7 import ( 8 "fmt" 9 "math" 10 "testing" 11 ) 12 13 func TestFormat(t *testing.T) { 14 t.Parallel() 15 type rp struct { 16 format string 17 output string 18 } 19 sqrt := func(_, _ int, v float64) float64 { return math.Sqrt(v) } 20 for i, test := range []struct { 21 m fmt.Formatter 22 rep []rp 23 }{ 24 // Dense matrix representation 25 { 26 m: Formatted(NewDense(3, 3, []float64{0, 0, 0, 0, 0, 0, 0, 0, 0})), 27 rep: []rp{ 28 {"%v", "⎡0 0 0⎤\n⎢0 0 0⎥\n⎣0 0 0⎦"}, 29 {"% f", "⎡. . .⎤\n⎢. . .⎥\n⎣. . .⎦"}, 30 {"%#v", fmt.Sprintf("%#v", NewDense(3, 3, nil))}, 31 {"%s", "%!s(*mat.Dense=Dims(3, 3))"}, 32 }, 33 }, 34 { 35 m: Formatted(NewDense(3, 3, []float64{1, 1, 1, 1, 1, 1, 1, 1, 1})), 36 rep: []rp{ 37 {"%v", "⎡1 1 1⎤\n⎢1 1 1⎥\n⎣1 1 1⎦"}, 38 {"% f", "⎡1 1 1⎤\n⎢1 1 1⎥\n⎣1 1 1⎦"}, 39 {"%#v", fmt.Sprintf("%#v", NewDense(3, 3, []float64{1, 1, 1, 1, 1, 1, 1, 1, 1}))}, 40 }, 41 }, 42 { 43 m: Formatted(NewDense(3, 3, []float64{1, 1, 1, 1, 1, 1, 1, 1, 1}), Prefix("\t")), 44 rep: []rp{ 45 {"%v", "⎡1 1 1⎤\n\t⎢1 1 1⎥\n\t⎣1 1 1⎦"}, 46 {"% f", "⎡1 1 1⎤\n\t⎢1 1 1⎥\n\t⎣1 1 1⎦"}, 47 {"%#v", fmt.Sprintf("%#v", NewDense(3, 3, []float64{1, 1, 1, 1, 1, 1, 1, 1, 1}))}, 48 }, 49 }, 50 { 51 m: Formatted(NewDense(3, 3, []float64{1, 0, 0, 0, 1, 0, 0, 0, 1})), 52 rep: []rp{ 53 {"%v", "⎡1 0 0⎤\n⎢0 1 0⎥\n⎣0 0 1⎦"}, 54 {"% f", "⎡1 . .⎤\n⎢. 1 .⎥\n⎣. . 1⎦"}, 55 {"%#v", fmt.Sprintf("%#v", NewDense(3, 3, []float64{1, 0, 0, 0, 1, 0, 0, 0, 1}))}, 56 }, 57 }, 58 { 59 m: Formatted(NewDense(2, 3, []float64{1, 2, 3, 4, 5, 6})), 60 rep: []rp{ 61 {"%v", "⎡1 2 3⎤\n⎣4 5 6⎦"}, 62 {"% f", "⎡1 2 3⎤\n⎣4 5 6⎦"}, 63 {"%#v", fmt.Sprintf("%#v", NewDense(2, 3, []float64{1, 2, 3, 4, 5, 6}))}, 64 }, 65 }, 66 { 67 m: Formatted(NewDense(3, 2, []float64{1, 2, 3, 4, 5, 6})), 68 rep: []rp{ 69 {"%v", "⎡1 2⎤\n⎢3 4⎥\n⎣5 6⎦"}, 70 {"% f", "⎡1 2⎤\n⎢3 4⎥\n⎣5 6⎦"}, 71 {"%#v", fmt.Sprintf("%#v", NewDense(3, 2, []float64{1, 2, 3, 4, 5, 6}))}, 72 }, 73 }, 74 { 75 m: func() fmt.Formatter { 76 m := NewDense(2, 3, []float64{0, 1, 2, 3, 4, 5}) 77 m.Apply(sqrt, m) 78 return Formatted(m) 79 }(), 80 rep: []rp{ 81 {"%v", "⎡ 0 1 1.4142135623730951⎤\n⎣1.7320508075688772 2 2.23606797749979⎦"}, 82 {"%.2f", "⎡0.00 1.00 1.41⎤\n⎣1.73 2.00 2.24⎦"}, 83 {"% f", "⎡ . 1 1.4142135623730951⎤\n⎣1.7320508075688772 2 2.23606797749979⎦"}, 84 {"%#v", fmt.Sprintf("%#v", NewDense(2, 3, []float64{0, 1, 1.4142135623730951, 1.7320508075688772, 2, 2.23606797749979}))}, 85 }, 86 }, 87 { 88 m: func() fmt.Formatter { 89 m := NewDense(3, 2, []float64{0, 1, 2, 3, 4, 5}) 90 m.Apply(sqrt, m) 91 return Formatted(m) 92 }(), 93 rep: []rp{ 94 {"%v", "⎡ 0 1⎤\n⎢1.4142135623730951 1.7320508075688772⎥\n⎣ 2 2.23606797749979⎦"}, 95 {"%.2f", "⎡0.00 1.00⎤\n⎢1.41 1.73⎥\n⎣2.00 2.24⎦"}, 96 {"% f", "⎡ . 1⎤\n⎢1.4142135623730951 1.7320508075688772⎥\n⎣ 2 2.23606797749979⎦"}, 97 {"%#v", fmt.Sprintf("%#v", NewDense(3, 2, []float64{0, 1, 1.4142135623730951, 1.7320508075688772, 2, 2.23606797749979}))}, 98 }, 99 }, 100 { 101 m: func() fmt.Formatter { 102 m := NewDense(2, 3, []float64{0, 1, 2, 3, 4, 5}) 103 m.Apply(sqrt, m) 104 return Formatted(m, Squeeze()) 105 }(), 106 rep: []rp{ 107 {"%v", "⎡ 0 1 1.4142135623730951⎤\n⎣1.7320508075688772 2 2.23606797749979⎦"}, 108 {"%.2f", "⎡0.00 1.00 1.41⎤\n⎣1.73 2.00 2.24⎦"}, 109 {"% f", "⎡ . 1 1.4142135623730951⎤\n⎣1.7320508075688772 2 2.23606797749979⎦"}, 110 {"%#v", fmt.Sprintf("%#v", NewDense(2, 3, []float64{0, 1, 1.4142135623730951, 1.7320508075688772, 2, 2.23606797749979}))}, 111 }, 112 }, 113 { 114 m: func() fmt.Formatter { 115 m := NewDense(1, 10, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) 116 return Formatted(m, Excerpt(3)) 117 }(), 118 rep: []rp{ 119 {"%v", "Dims(1, 10)\n[ 1 2 3 ... ... 8 9 10]"}, 120 }, 121 }, 122 { 123 m: func() fmt.Formatter { 124 m := NewDense(10, 1, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) 125 return Formatted(m, Excerpt(3)) 126 }(), 127 rep: []rp{ 128 {"%v", "Dims(10, 1)\n⎡ 1⎤\n⎢ 2⎥\n⎢ 3⎥\n .\n .\n .\n⎢ 8⎥\n⎢ 9⎥\n⎣10⎦"}, 129 }, 130 }, 131 { 132 m: func() fmt.Formatter { 133 m := NewDense(10, 10, nil) 134 for i := 0; i < 10; i++ { 135 m.Set(i, i, 1) 136 } 137 return Formatted(m, Excerpt(3)) 138 }(), 139 rep: []rp{ 140 {"%v", "Dims(10, 10)\n⎡1 0 0 ... ... 0 0 0⎤\n⎢0 1 0 0 0 0⎥\n⎢0 0 1 0 0 0⎥\n .\n .\n .\n⎢0 0 0 1 0 0⎥\n⎢0 0 0 0 1 0⎥\n⎣0 0 0 ... ... 0 0 1⎦"}, 141 }, 142 }, 143 { 144 m: Formatted(NewDense(9, 1, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}), FormatMATLAB()), 145 rep: []rp{ 146 {"%v", "[1; 2; 3; 4; 5; 6; 7; 8; 9]"}, 147 {"%#v", "[\n 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n]"}, 148 {"%s", "%!s(*mat.Dense=Dims(9, 1))"}, 149 {"%#s", "%!s(*mat.Dense=Dims(9, 1))"}, 150 }, 151 }, 152 { 153 m: Formatted(NewDense(1, 9, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}), FormatMATLAB()), 154 rep: []rp{ 155 {"%v", "[1 2 3 4 5 6 7 8 9]"}, 156 {"%#v", "[1 2 3 4 5 6 7 8 9]"}, 157 }, 158 }, 159 { 160 m: Formatted(NewDense(3, 3, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}), FormatMATLAB()), 161 rep: []rp{ 162 {"%v", "[1 2 3; 4 5 6; 7 8 9]"}, 163 {"%#v", "[\n 1 2 3\n 4 5 6\n 7 8 9\n]"}, 164 }, 165 }, 166 { 167 m: Formatted(NewDense(9, 1, []float64{1, -2, 3, 4, 5, 6, 7, 8, 9}), FormatMATLAB()), 168 rep: []rp{ 169 {"%v", "[1; -2; 3; 4; 5; 6; 7; 8; 9]"}, 170 {"%#v", "[\n 1\n -2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n]"}, 171 }, 172 }, 173 { 174 m: Formatted(NewDense(1, 9, []float64{1, -2, 3, 4, 5, 6, 7, 8, 9}), FormatMATLAB()), 175 rep: []rp{ 176 {"%v", "[1 -2 3 4 5 6 7 8 9]"}, 177 {"%#v", "[ 1 -2 3 4 5 6 7 8 9]"}, 178 }, 179 }, 180 { 181 m: Formatted(NewDense(3, 3, []float64{1, -2, 3, 4, 5, 6, 7, 8, 9}), FormatMATLAB()), 182 rep: []rp{ 183 {"%v", "[1 -2 3; 4 5 6; 7 8 9]"}, 184 {"%#v", "[\n 1 -2 3\n 4 5 6\n 7 8 9\n]"}, 185 }, 186 }, 187 188 { 189 m: Formatted(NewDense(9, 1, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}), FormatPython()), 190 rep: []rp{ 191 {"%v", "[[1], [2], [3], [4], [5], [6], [7], [8], [9]]"}, 192 {"%#v", "[[1],\n [2],\n [3],\n [4],\n [5],\n [6],\n [7],\n [8],\n [9]]"}, 193 {"%s", "%!s(*mat.Dense=Dims(9, 1))"}, 194 {"%#s", "%!s(*mat.Dense=Dims(9, 1))"}, 195 }, 196 }, 197 { 198 m: Formatted(NewDense(1, 9, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}), FormatPython()), 199 rep: []rp{ 200 {"%v", "[1, 2, 3, 4, 5, 6, 7, 8, 9]"}, 201 {"%#v", "[1, 2, 3, 4, 5, 6, 7, 8, 9]"}, 202 }, 203 }, 204 { 205 m: Formatted(NewDense(3, 3, []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}), FormatPython()), 206 rep: []rp{ 207 {"%v", "[[1, 2, 3], [4, 5, 6], [7, 8, 9]]"}, 208 {"%#v", "[[1, 2, 3],\n [4, 5, 6],\n [7, 8, 9]]"}, 209 }, 210 }, 211 { 212 m: Formatted(NewDense(9, 1, []float64{1, -2, 3, 4, 5, 6, 7, 8, 9}), FormatPython()), 213 rep: []rp{ 214 {"%v", "[[1], [-2], [3], [4], [5], [6], [7], [8], [9]]"}, 215 {"%#v", "[[ 1],\n [-2],\n [ 3],\n [ 4],\n [ 5],\n [ 6],\n [ 7],\n [ 8],\n [ 9]]"}, 216 }, 217 }, 218 { 219 m: Formatted(NewDense(1, 9, []float64{1, -2, 3, 4, 5, 6, 7, 8, 9}), FormatPython()), 220 rep: []rp{ 221 {"%v", "[1, -2, 3, 4, 5, 6, 7, 8, 9]"}, 222 {"%#v", "[ 1, -2, 3, 4, 5, 6, 7, 8, 9]"}, 223 }, 224 }, 225 { 226 m: Formatted(NewDense(3, 3, []float64{1, -2, 3, 4, 5, 6, 7, 8, 9}), FormatPython()), 227 rep: []rp{ 228 {"%v", "[[1, -2, 3], [4, 5, 6], [7, 8, 9]]"}, 229 {"%#v", "[[ 1, -2, 3],\n [ 4, 5, 6],\n [ 7, 8, 9]]"}, 230 }, 231 }, 232 } { 233 for j, rp := range test.rep { 234 got := fmt.Sprintf(rp.format, test.m) 235 if got != rp.output { 236 t.Errorf("unexpected format result test %d part %d:\ngot:\n%s\nwant:\n%s", i, j, got, rp.output) 237 } 238 } 239 } 240 }