(t *testing.T)
| 235 | } |
| 236 | |
| 237 | func TestReducerMinMaxSum(t *testing.T) { |
| 238 | tests := []struct { |
| 239 | rows [][]ast.Constant |
| 240 | wantMin ast.Constant |
| 241 | wantMax ast.Constant |
| 242 | wantSum ast.Constant |
| 243 | wantAvg ast.Constant |
| 244 | }{ |
| 245 | { |
| 246 | rows: [][]ast.Constant{ |
| 247 | {ast.Number(1)}, |
| 248 | {ast.Number(1)}, |
| 249 | {ast.Number(3)}, |
| 250 | }, |
| 251 | wantMin: ast.Number(1), |
| 252 | wantMax: ast.Number(3), |
| 253 | wantSum: ast.Number(5), |
| 254 | wantAvg: ast.Float64((float64(1) + float64(1) + float64(3)) / float64(3)), |
| 255 | }, |
| 256 | // Note that EvalReducerFn is never called with empty list of rows. |
| 257 | // The reducer functions may be called in user code though. |
| 258 | { |
| 259 | rows: nil, |
| 260 | wantMin: ast.Number(math.MaxInt64), |
| 261 | wantMax: ast.Number(math.MinInt64), |
| 262 | wantSum: ast.Number(0), |
| 263 | wantAvg: ast.Float64(math.NaN()), |
| 264 | }, |
| 265 | } |
| 266 | for _, test := range tests { |
| 267 | var rows []ast.ConstSubstList |
| 268 | for _, row := range test.rows { |
| 269 | rows = append(rows, makeConstSubstList([]ast.Variable{ast.Variable{"X"}}, row)) |
| 270 | } |
| 271 | gotMax, err := EvalReduceFn(ast.ApplyFn{symbols.Max, []ast.BaseTerm{ast.Variable{"X"}}}, rows) |
| 272 | if err != nil { |
| 273 | t.Fatalf("EvalReduceFn(Max,%v) failed with %v", rows, err) |
| 274 | } |
| 275 | if test.wantMax != gotMax { |
| 276 | t.Errorf("EvalReduceFn(Max, %v)=%v want %v", rows, gotMax, test.wantMax) |
| 277 | } |
| 278 | gotMin, err := EvalReduceFn(ast.ApplyFn{symbols.Min, []ast.BaseTerm{ast.Variable{"X"}}}, rows) |
| 279 | if err != nil { |
| 280 | t.Fatalf("EvalReduceFn(Min,%v) failed with %v", rows, err) |
| 281 | } |
| 282 | if test.wantMin != gotMin { |
| 283 | t.Errorf("EvalReduceFn(Min, %v)=%v want %v", rows, gotMin, test.wantMin) |
| 284 | } |
| 285 | gotSum, err := EvalReduceFn(ast.ApplyFn{symbols.Sum, []ast.BaseTerm{ast.Variable{"X"}}}, rows) |
| 286 | if err != nil { |
| 287 | t.Fatalf("EvalReduceFn(Sum, %v) failed with %v", rows, err) |
| 288 | } |
| 289 | if test.wantSum != gotSum { |
| 290 | t.Errorf("EvalReduceFn(Sum, %v)=%v want %v", rows, gotSum, test.wantSum) |
| 291 | } |
| 292 | gotAvg, err := EvalReduceFn(ast.ApplyFn{symbols.Avg, []ast.BaseTerm{ast.Variable{"X"}}}, rows) |
| 293 | if err != nil { |
| 294 | t.Fatalf("EvalReduceFn(Avg, %v) failed with %v", rows, err) |
nothing calls this directly
no test coverage detected