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  }