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