modernc.org/99c@v1.0.1-0.20181109153923-a9e8197063d9/all_test.go (about) 1 // Copyright 2017 The 99c Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "fmt" 9 "io/ioutil" 10 "os" 11 "path" 12 "path/filepath" 13 "runtime" 14 "strings" 15 "testing" 16 17 "modernc.org/ir" 18 "modernc.org/virtual" 19 "modernc.org/xc" 20 ) 21 22 func caller(s string, va ...interface{}) { 23 if s == "" { 24 s = strings.Repeat("%v ", len(va)) 25 } 26 _, fn, fl, _ := runtime.Caller(2) 27 fmt.Fprintf(os.Stderr, "# caller: %s:%d: ", path.Base(fn), fl) 28 fmt.Fprintf(os.Stderr, s, va...) 29 fmt.Fprintln(os.Stderr) 30 _, fn, fl, _ = runtime.Caller(1) 31 fmt.Fprintf(os.Stderr, "# \tcallee: %s:%d: ", path.Base(fn), fl) 32 fmt.Fprintln(os.Stderr) 33 os.Stderr.Sync() 34 } 35 36 func dbg(s string, va ...interface{}) { 37 if s == "" { 38 s = strings.Repeat("%v ", len(va)) 39 } 40 _, fn, fl, _ := runtime.Caller(1) 41 fmt.Fprintf(os.Stderr, "# dbg %s:%d: ", path.Base(fn), fl) 42 fmt.Fprintf(os.Stderr, s, va...) 43 fmt.Fprintln(os.Stderr) 44 os.Stderr.Sync() 45 } 46 47 func TODO(...interface{}) string { //TODOOK 48 _, fn, fl, _ := runtime.Caller(1) 49 return fmt.Sprintf("# TODO: %s:%d:\n", path.Base(fn), fl) //TODOOK 50 } 51 52 func use(...interface{}) {} 53 54 func init() { 55 use(caller, dbg, TODO) //TODOOK 56 } 57 58 // ============================================================================ 59 60 // https://gitlab.com/cznic/99c/issues/4 61 func TestIssue4(t *testing.T) { 62 src, err := filepath.Abs("testdata/issue4.c") 63 if err != nil { 64 t.Fatal(err) 65 } 66 67 wd, err := os.Getwd() 68 if err != nil { 69 t.Fatal(err) 70 } 71 72 defer func() { 73 if err := os.Chdir(wd); err != nil { 74 t.Fatal(err) 75 } 76 }() 77 78 dir, err := ioutil.TempDir("", "99c-test-") 79 if err != nil { 80 t.Fatal(err) 81 } 82 83 if err := os.Chdir(dir); err != nil { 84 t.Fatal(err) 85 } 86 87 defer os.RemoveAll(dir) 88 89 var obj, obj2 ir.Objects 90 j := newTask() 91 j.args.c = true 92 j.args.hooks.obj = &obj 93 j.args.args = []string{src} 94 if err := j.main(); err != nil { 95 t.Fatal(err) 96 } 97 98 objf := filepath.Join(dir, "issue4.o") 99 f, err := os.Open(objf) 100 if err != nil { 101 t.Fatal(err) 102 } 103 104 if _, err := obj2.ReadFrom(f); err != nil { 105 t.Fatal(err) 106 } 107 108 if err := f.Close(); err != nil { 109 t.Fatal(err) 110 } 111 112 if g, e := ir.PrettyString(obj2), ir.PrettyString(obj); g != e { 113 t.Fatalf("got\n%s\nexp\n%s", g, e) 114 } 115 116 var bin *virtual.Binary 117 j = newTask() 118 j.args.args = []string{objf} 119 j.args.g = true 120 j.args.hooks.bin = &bin 121 if err := j.main(); err != nil { 122 t.Fatal(err) 123 } 124 125 if _, ok := bin.Sym[ir.NameID(xc.Dict.SID("fib"))]; !ok { 126 t.Fatalf("fib symbol missing: %v", bin.Sym) 127 } 128 } 129 130 func TestLibToolConfig(t *testing.T) { 131 m, err := filepath.Glob(filepath.Join("testdata", "*.la")) 132 if err != nil { 133 t.Fatal(err) 134 } 135 136 for _, v := range m { 137 c, err := newLibToolConfigFile(v) 138 if err != nil { 139 t.Fatal(err) 140 } 141 142 t.Logf("%s: %#v", v, c) 143 } 144 }