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