| // runoutput | |
| // Copyright 2012 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Issue 3804 | |
| // test all possible float -> integer conversions | |
| package main | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "strings" | |
| ) | |
| var ( | |
| intWidths = []int{8, 16, 32, 64} // int%d and uint%d | |
| floatWidths = []int{32, 64} // float%d | |
| ) | |
| func main() { | |
| var names, funcs bytes.Buffer | |
| for _, iWidth := range intWidths { | |
| for _, typ := range []string{"int", "uint"} { | |
| var segs bytes.Buffer | |
| itype := fmt.Sprintf("%s%d", typ, iWidth) | |
| names.WriteString("\ttest" + itype + ",\n") | |
| for _, fWidth := range floatWidths { | |
| ftype := fmt.Sprintf("float%d", fWidth) | |
| seg := strings.Replace(testSegment, "$F", ftype, -1) | |
| seg = strings.Replace(seg, "$I", itype, -1) | |
| segs.WriteString(seg) | |
| } | |
| body := strings.Replace(testFunc, "$I", itype, -1) | |
| if typ[0] == 'u' { | |
| body = strings.Replace(body, "$TEST", " || i < 0", 1) | |
| } else { | |
| body = strings.Replace(body, "$TEST", "", 1) | |
| } | |
| body = strings.Replace(body, "$TESTSEGMENTS", segs.String(), 1) | |
| funcs.WriteString(body) | |
| } | |
| } | |
| program = strings.Replace(program, "$NAMES", names.String(), 1) | |
| program = strings.Replace(program, "$FUNCS", funcs.String(), 1) | |
| fmt.Print(program) | |
| } | |
| const testSegment = ` | |
| f$F := $F(f) | |
| if math.Abs(float64(f$F) - f) < 0.05 { | |
| if v := $I(f$F); v != $I(i) { | |
| fmt.Printf("$I($F(%f)) = %v, expected %v\n", f, v, i) | |
| } | |
| }` | |
| const testFunc = | |
| `func test$I(f float64, i int64) { | |
| if i != int64($I(i))$TEST { | |
| return | |
| } | |
| $TESTSEGMENTS | |
| } | |
| ` | |
| var program = | |
| `package main | |
| import ( | |
| "fmt" | |
| "math" | |
| ) | |
| var tests = []struct { | |
| f float64 | |
| i int64 | |
| }{ | |
| {39.7, 39}, | |
| {-39.7, -39}, | |
| {258.6, 258}, | |
| {-258.6, -258}, | |
| {65538.9, 65538}, | |
| {-65538.9, -65538}, | |
| {4294967298.8, 4294967298}, | |
| {-4294967298.8, -4294967298}, | |
| } | |
| var funcs = []func(float64, int64){ | |
| $NAMES | |
| } | |
| $FUNCS | |
| func main() { | |
| for _, t := range tests { | |
| for _, f := range funcs { | |
| f(t.f, t.i) | |
| } | |
| } | |
| } | |
| ` |