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