github.com/q45/go@v0.0.0-20151101211701-a4fb8c13db3f/src/cmd/compile/internal/gc/pgen_test.go (about)

     1  // Copyright 2015 The Go 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 gc
     6  
     7  import (
     8  	"reflect"
     9  	"testing"
    10  )
    11  
    12  // Test all code paths for cmpstackvarlt.
    13  func TestCmpstackvar(t *testing.T) {
    14  	testdata := []struct {
    15  		a, b Node
    16  		lt   bool
    17  	}{
    18  		{
    19  			Node{Class: PAUTO},
    20  			Node{Class: PFUNC},
    21  			false,
    22  		},
    23  		{
    24  			Node{Class: PFUNC},
    25  			Node{Class: PAUTO},
    26  			true,
    27  		},
    28  		{
    29  			Node{Class: PFUNC, Xoffset: 0},
    30  			Node{Class: PFUNC, Xoffset: 10},
    31  			true,
    32  		},
    33  		{
    34  			Node{Class: PFUNC, Xoffset: 20},
    35  			Node{Class: PFUNC, Xoffset: 10},
    36  			false,
    37  		},
    38  		{
    39  			Node{Class: PFUNC, Xoffset: 10},
    40  			Node{Class: PFUNC, Xoffset: 10},
    41  			false,
    42  		},
    43  		{
    44  			Node{Class: PAUTO, Used: true},
    45  			Node{Class: PAUTO, Used: false},
    46  			true,
    47  		},
    48  		{
    49  			Node{Class: PAUTO, Used: false},
    50  			Node{Class: PAUTO, Used: true},
    51  			false,
    52  		},
    53  		{
    54  			Node{Class: PAUTO, Type: &Type{Haspointers: 1}}, // haspointers -> false
    55  			Node{Class: PAUTO, Type: &Type{Haspointers: 2}}, // haspointers -> true
    56  			false,
    57  		},
    58  		{
    59  			Node{Class: PAUTO, Type: &Type{Haspointers: 2}}, // haspointers -> true
    60  			Node{Class: PAUTO, Type: &Type{Haspointers: 1}}, // haspointers -> false
    61  			true,
    62  		},
    63  		{
    64  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}},
    65  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: false}},
    66  			true,
    67  		},
    68  		{
    69  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: false}},
    70  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}},
    71  			false,
    72  		},
    73  		{
    74  			Node{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}},
    75  			Node{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}},
    76  			false,
    77  		},
    78  		{
    79  			Node{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}},
    80  			Node{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}},
    81  			true,
    82  		},
    83  		{
    84  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
    85  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
    86  			true,
    87  		},
    88  		{
    89  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
    90  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
    91  			false,
    92  		},
    93  		{
    94  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
    95  			Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
    96  			false,
    97  		},
    98  	}
    99  	for _, d := range testdata {
   100  		got := cmpstackvarlt(&d.a, &d.b)
   101  		if got != d.lt {
   102  			t.Errorf("want %#v < %#v", d.a, d.b)
   103  		}
   104  	}
   105  }
   106  
   107  func slice2nodelist(s []*Node) *NodeList {
   108  	var nl *NodeList
   109  	for _, n := range s {
   110  		nl = list(nl, n)
   111  	}
   112  	return nl
   113  }
   114  
   115  func nodelist2slice(nl *NodeList) []*Node {
   116  	var s []*Node
   117  	for l := nl; l != nil; l = l.Next {
   118  		s = append(s, l.N)
   119  	}
   120  	return s
   121  }
   122  
   123  func TestListsort(t *testing.T) {
   124  	inp := []*Node{
   125  		{Class: PFUNC, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   126  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   127  		{Class: PFUNC, Xoffset: 0, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   128  		{Class: PFUNC, Xoffset: 10, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   129  		{Class: PFUNC, Xoffset: 20, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   130  		{Class: PAUTO, Used: true, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   131  		{Class: PAUTO, Type: &Type{Haspointers: 1}, Name: &Name{}, Sym: &Sym{}}, // haspointers -> false
   132  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   133  		{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}, Sym: &Sym{}},
   134  		{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}, Sym: &Sym{}},
   135  		{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}, Sym: &Sym{}},
   136  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
   137  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
   138  	}
   139  	want := []*Node{
   140  		{Class: PFUNC, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   141  		{Class: PFUNC, Xoffset: 0, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   142  		{Class: PFUNC, Xoffset: 10, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   143  		{Class: PFUNC, Xoffset: 20, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   144  		{Class: PAUTO, Used: true, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   145  		{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}, Sym: &Sym{}},
   146  		{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}, Sym: &Sym{}},
   147  		{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}, Sym: &Sym{}},
   148  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   149  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
   150  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
   151  		{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
   152  		{Class: PAUTO, Type: &Type{Haspointers: 1}, Name: &Name{}, Sym: &Sym{}}, // haspointers -> false
   153  	}
   154  	// haspointers updates Type.Haspointers as a side effect, so
   155  	// exercise this function on all inputs so that reflect.DeepEqual
   156  	// doesn't produce false positives.
   157  	for i := range want {
   158  		haspointers(want[i].Type)
   159  		haspointers(inp[i].Type)
   160  	}
   161  
   162  	nl := slice2nodelist(inp)
   163  	listsort(&nl, cmpstackvarlt)
   164  	got := nodelist2slice(nl)
   165  	if !reflect.DeepEqual(want, got) {
   166  		t.Error("listsort failed")
   167  		for i := range got {
   168  			g := got[i]
   169  			w := want[i]
   170  			eq := reflect.DeepEqual(w, g)
   171  			if !eq {
   172  				t.Log(i, w, g)
   173  			}
   174  		}
   175  	}
   176  }