github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/fixedbugs/bug447.go (about) 1 // runoutput 2 3 // Copyright 2012 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Issue 3804 8 // test all possible float -> integer conversions 9 10 package main 11 12 import ( 13 "bytes" 14 "fmt" 15 "strings" 16 ) 17 18 var ( 19 intWidths = []int{8, 16, 32, 64} // int%d and uint%d 20 floatWidths = []int{32, 64} // float%d 21 ) 22 23 func main() { 24 25 var names, funcs bytes.Buffer 26 27 for _, iWidth := range intWidths { 28 for _, typ := range []string{"int", "uint"} { 29 var segs bytes.Buffer 30 itype := fmt.Sprintf("%s%d", typ, iWidth) 31 names.WriteString("\ttest" + itype + ",\n") 32 for _, fWidth := range floatWidths { 33 ftype := fmt.Sprintf("float%d", fWidth) 34 seg := strings.Replace(testSegment, "$F", ftype, -1) 35 seg = strings.Replace(seg, "$I", itype, -1) 36 segs.WriteString(seg) 37 } 38 body := strings.Replace(testFunc, "$I", itype, -1) 39 if typ[0] == 'u' { 40 body = strings.Replace(body, "$TEST", " || i < 0", 1) 41 } else { 42 body = strings.Replace(body, "$TEST", "", 1) 43 } 44 body = strings.Replace(body, "$TESTSEGMENTS", segs.String(), 1) 45 funcs.WriteString(body) 46 } 47 } 48 49 program = strings.Replace(program, "$NAMES", names.String(), 1) 50 program = strings.Replace(program, "$FUNCS", funcs.String(), 1) 51 fmt.Print(program) 52 } 53 54 const testSegment = ` 55 f$F := $F(f) 56 if math.Abs(float64(f$F) - f) < 0.05 { 57 if v := $I(f$F); v != $I(i) { 58 fmt.Printf("$I($F(%f)) = %v, expected %v\n", f, v, i) 59 } 60 }` 61 62 const testFunc = 63 `func test$I(f float64, i int64) { 64 if i != int64($I(i))$TEST { 65 return 66 } 67 $TESTSEGMENTS 68 } 69 ` 70 71 var program = 72 `package main 73 74 import ( 75 "fmt" 76 "math" 77 ) 78 79 var tests = []struct { 80 f float64 81 i int64 82 }{ 83 {39.7, 39}, 84 {-39.7, -39}, 85 {258.6, 258}, 86 {-258.6, -258}, 87 {65538.9, 65538}, 88 {-65538.9, -65538}, 89 {4294967298.8, 4294967298}, 90 {-4294967298.8, -4294967298}, 91 } 92 93 var funcs = []func(float64, int64){ 94 $NAMES 95 } 96 97 $FUNCS 98 func main() { 99 for _, t := range tests { 100 for _, f := range funcs { 101 f(t.f, t.i) 102 } 103 } 104 } 105 `