typeset_test.go raw

   1  // Copyright 2021 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 types
   6  
   7  import (
   8  	"go/ast"
   9  	"go/parser"
  10  	"go/token"
  11  	"testing"
  12  )
  13  
  14  func TestInvalidTypeSet(t *testing.T) {
  15  	if !invalidTypeSet.IsEmpty() {
  16  		t.Error("invalidTypeSet is not empty")
  17  	}
  18  }
  19  
  20  func TestTypeSetString(t *testing.T) {
  21  	for body, want := range map[string]string{
  22  		"{}":            "𝓤",
  23  		"{int}":         "{int}",
  24  		"{~int}":        "{~int}",
  25  		"{int|string}":  "{int | string}",
  26  		"{int; string}": "∅",
  27  
  28  		"{comparable}":              "{comparable}",
  29  		"{comparable; int}":         "{int}",
  30  		"{~int; comparable}":        "{~int}",
  31  		"{int|string; comparable}":  "{int | string}",
  32  		"{comparable; int; string}": "∅",
  33  
  34  		"{m()}":                         "{func (p.T).m()}",
  35  		"{m1(); m2() int }":             "{func (p.T).m1(); func (p.T).m2() int}",
  36  		"{error}":                       "{func (error).Error() string}",
  37  		"{m(); comparable}":             "{comparable; func (p.T).m()}",
  38  		"{m1(); comparable; m2() int }": "{comparable; func (p.T).m1(); func (p.T).m2() int}",
  39  		"{comparable; error}":           "{comparable; func (error).Error() string}",
  40  
  41  		"{m(); comparable; int|float32|string}": "{func (p.T).m(); int | float32 | string}",
  42  		"{m1(); int; m2(); comparable }":        "{func (p.T).m1(); func (p.T).m2(); int}",
  43  
  44  		"{E}; type E interface{}":           "𝓤",
  45  		"{E}; type E interface{int;string}": "∅",
  46  		"{E}; type E interface{comparable}": "{comparable}",
  47  	} {
  48  		// parse
  49  		src := "package p; type T interface" + body
  50  		fset := token.NewFileSet()
  51  		file, err := parser.ParseFile(fset, "p.go", src, parser.AllErrors)
  52  		if file == nil {
  53  			t.Fatalf("%s: %v (invalid test case)", body, err)
  54  		}
  55  
  56  		// type check
  57  		var conf Config
  58  		pkg, err := conf.Check(file.Name.Name, fset, []*ast.File{file}, nil)
  59  		if err != nil {
  60  			t.Fatalf("%s: %v (invalid test case)", body, err)
  61  		}
  62  
  63  		// lookup T
  64  		obj := pkg.scope.Lookup("T")
  65  		if obj == nil {
  66  			t.Fatalf("%s: T not found (invalid test case)", body)
  67  		}
  68  		T, ok := under(obj.Type()).(*Interface)
  69  		if !ok {
  70  			t.Fatalf("%s: %v is not an interface (invalid test case)", body, obj)
  71  		}
  72  
  73  		// verify test case
  74  		got := T.typeSet().String()
  75  		if got != want {
  76  			t.Errorf("%s: got %s; want %s", body, got, want)
  77  		}
  78  	}
  79  }
  80  
  81  // TODO(gri) add more tests
  82