github.com/visualfc/xtype@v0.2.0/xtype_test.go (about)

     1  package xtype_test
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"runtime"
     7  	"testing"
     8  
     9  	"github.com/visualfc/xtype"
    10  )
    11  
    12  func TestInt(t *testing.T) {
    13  	type T int
    14  	i1 := T(100)
    15  	if n := xtype.Int(i1); n != 100 {
    16  		t.Fatal(n)
    17  	}
    18  	typ := xtype.TypeOf(i1)
    19  	i2 := xtype.Make(typ, 200)
    20  	if n := xtype.Int(i2); n != 200 {
    21  		t.Fatal(n)
    22  	}
    23  }
    24  
    25  func TestUint(t *testing.T) {
    26  	type T uint
    27  	i1 := T(100)
    28  	if n := xtype.Uint(i1); n != 100 {
    29  		t.Fatal(n)
    30  	}
    31  	typ := xtype.TypeOf(i1)
    32  	i2 := xtype.Make(typ, 200)
    33  	if n := xtype.Uint(i2); n != 200 {
    34  		t.Fatal(n)
    35  	}
    36  }
    37  
    38  func TestFloat32(t *testing.T) {
    39  	type T float32
    40  	i1 := T(100.1)
    41  	if n := xtype.Float32(i1); n != 100.1 {
    42  		t.Fatal("check", n)
    43  	}
    44  	typ := xtype.TypeOf(i1)
    45  	i2 := xtype.Make(typ, float32(200.1))
    46  	if n := xtype.Float32(i2); n != 200.1 {
    47  		t.Fatal("new at", n)
    48  	}
    49  }
    50  
    51  func TestComplex64(t *testing.T) {
    52  	type T complex64
    53  	i1 := T(1 + 2i)
    54  	if n := xtype.Complex64(i1); n != 1+2i {
    55  		t.Fatal("check", n)
    56  	}
    57  	typ := xtype.TypeOf(i1)
    58  	i2 := xtype.Make(typ, complex64(3+4i))
    59  	if n := xtype.Complex64(i2); n != 3+4i {
    60  		t.Fatal("new at", n)
    61  	}
    62  }
    63  
    64  func TestString(t *testing.T) {
    65  	type T string
    66  	i1 := T("hello")
    67  	if n := xtype.String(i1); n != "hello" {
    68  		t.Fatal("check", n)
    69  	}
    70  	typ := xtype.TypeOf(i1)
    71  	i2 := xtype.Make(typ, "world")
    72  	if n := xtype.String(i2); n != "world" {
    73  		t.Fatal("new at", n)
    74  	}
    75  }
    76  
    77  func TestNot(t *testing.T) {
    78  	type T bool
    79  	var b T
    80  	if r := xtype.Not(b); xtype.Bool(r) != true {
    81  		t.Fatal("must true")
    82  	}
    83  	b = true
    84  	if r := xtype.Not(b); xtype.Bool(r) != false {
    85  		t.Fatal("must false")
    86  	}
    87  }
    88  
    89  func TestNegInt(t *testing.T) {
    90  	type T int
    91  	var n T = 100
    92  	if r := xtype.NegInt(n); xtype.Int(r) != -100 {
    93  		t.Fatal(r)
    94  	}
    95  	n = -200
    96  	if r := xtype.NegInt(n); xtype.Int(r) != 200 {
    97  		t.Fatal(r)
    98  	}
    99  }
   100  
   101  func TestNegUint8(t *testing.T) {
   102  	type T uint8
   103  	var n T = 255
   104  	if r := xtype.NegUint8(n); xtype.Uint8(r) != 1 {
   105  		t.Fatal(r)
   106  	}
   107  	n = 1
   108  	if r := xtype.NegUint8(n); xtype.Uint8(r) != 255 {
   109  		t.Fatal(r)
   110  	}
   111  }
   112  
   113  func TestNegFloat32(t *testing.T) {
   114  	type T float32
   115  	var n T = 123.456
   116  	if r := xtype.NegFloat32(n); xtype.Float32(r) != -123.456 {
   117  		t.Fatal(r)
   118  	}
   119  	n = -1
   120  	if r := xtype.NegFloat32(n); xtype.Float32(r) != 1 {
   121  		t.Fatal(r)
   122  	}
   123  }
   124  
   125  func TestNegComplex64(t *testing.T) {
   126  	type T complex64
   127  	var n T = 1 + 2i
   128  	if r := xtype.NegComplex64(n); xtype.Complex64(r) != -1-2i {
   129  		t.Fatal(r)
   130  	}
   131  	n = -1
   132  	if r := xtype.NegComplex64(n); xtype.Complex64(r) != 1 {
   133  		t.Fatal()
   134  	}
   135  }
   136  
   137  func TestXorInt8(t *testing.T) {
   138  	type T int8
   139  	var n T = 0b11
   140  	if r := xtype.XorInt8(n); xtype.Int8(r) != -0b100 {
   141  		t.Fatal(r)
   142  	}
   143  }
   144  
   145  func TestXorUint8(t *testing.T) {
   146  	type T uint
   147  	var n T = 0b11
   148  	if r := xtype.XorUint8(n); xtype.Uint8(r) != 0b11111100 {
   149  		t.Fatal(r)
   150  	}
   151  }
   152  
   153  func TestConvertInt(t *testing.T) {
   154  	type T int
   155  	var n int = 100
   156  	typ := xtype.TypeOf(T(0))
   157  	if r := xtype.ConvertInt(typ, n); xtype.Int(r) != n {
   158  		t.Fatal(r)
   159  	}
   160  }
   161  
   162  func TestConvertFloat32(t *testing.T) {
   163  	type T float32
   164  	var n float32 = 100.1
   165  	typ := xtype.TypeOf(T(0))
   166  	if r := xtype.ConvertFloat32(typ, n); xtype.Float32(r) != n {
   167  		t.Fatal(r)
   168  	}
   169  }
   170  
   171  func TestConvertComplex64(t *testing.T) {
   172  	type T complex64
   173  	var n complex64 = 1 + 2i
   174  	typ := xtype.TypeOf(T(0))
   175  	if r := xtype.ConvertComplex64(typ, n); xtype.Complex64(r) != n {
   176  		t.Fatal(r)
   177  	}
   178  }
   179  
   180  func TestConvertString(t *testing.T) {
   181  	type T string
   182  	var n string = "hello"
   183  	typ := xtype.TypeOf(T(""))
   184  	if r := xtype.ConvertString(typ, n); xtype.String(r) != n {
   185  		t.Fatal(r)
   186  	}
   187  }
   188  
   189  func TestMakeInt(t *testing.T) {
   190  	type T int
   191  	typ := xtype.TypeOf(T(0))
   192  	if r := xtype.MakeInt(typ, 100); xtype.Int(r) != 100 {
   193  		t.Fatal(r)
   194  	}
   195  }
   196  
   197  func TestMakeFloat32(t *testing.T) {
   198  	type T float32
   199  	typ := xtype.TypeOf(T(0))
   200  	if r := xtype.MakeFloat32(typ, 100.1); xtype.Float32(r) != 100.1 {
   201  		t.Fatal(r)
   202  	}
   203  }
   204  
   205  func TestAllocInt(t *testing.T) {
   206  	type T int
   207  	typ := xtype.TypeOf(T(0))
   208  	r := xtype.Alloc(typ)
   209  	if s := fmt.Sprintf("%T %#v", r, r); s != "xtype_test.T 0" {
   210  		panic(s)
   211  	}
   212  }
   213  
   214  func TestAllocStruct(t *testing.T) {
   215  	type T struct {
   216  		X int
   217  		Y int
   218  	}
   219  	typ := xtype.TypeOf(T{})
   220  	r := xtype.Alloc(typ)
   221  	if s := fmt.Sprintf("%#v", r); s != "xtype_test.T{X:0, Y:0}" {
   222  		panic(s)
   223  	}
   224  }
   225  
   226  func TestAllocPtr(t *testing.T) {
   227  	type T struct {
   228  		X int
   229  		Y int
   230  	}
   231  	typ := xtype.TypeOf(&T{})
   232  	r := xtype.Alloc(typ)
   233  	if s := fmt.Sprintf("%#v", r); s != "&xtype_test.T{X:0, Y:0}" {
   234  		panic(s)
   235  	}
   236  }
   237  
   238  func TestAllocInterfce(t *testing.T) {
   239  	if runtime.Compiler == "gopherjs" {
   240  		t.Skip("skip gopherjs")
   241  	}
   242  	type T = fmt.Stringer
   243  	typ := xtype.TypeOfType(reflect.TypeOf((*T)(nil)).Elem())
   244  	r := xtype.Alloc(typ)
   245  	if s := fmt.Sprintf("%#v", r); s != "fmt.Stringer(nil)" {
   246  		panic(s)
   247  	}
   248  }
   249  
   250  func TestNewInt(t *testing.T) {
   251  	type T int
   252  	v := T(0)
   253  	typ := xtype.TypeOf(v)
   254  	ptrto := xtype.TypeOf(&v)
   255  	r := xtype.New(typ, ptrto)
   256  	if s := fmt.Sprintf("%T %#v", r, *(r.(*T))); s != "*xtype_test.T 0" {
   257  		panic(s)
   258  	}
   259  }
   260  
   261  func TestNewStruct(t *testing.T) {
   262  	type T struct {
   263  		X int
   264  		Y int
   265  	}
   266  	var v T
   267  	typ := xtype.TypeOf(v)
   268  	ptrto := xtype.TypeOf(&v)
   269  	r := xtype.New(typ, ptrto)
   270  	if s := fmt.Sprintf("%#v", r); s != "&xtype_test.T{X:0, Y:0}" {
   271  		panic(s)
   272  	}
   273  }
   274  
   275  func TestNewInterfce(t *testing.T) {
   276  	type T = fmt.Stringer
   277  	rt := reflect.TypeOf((*T)(nil))
   278  	typ := xtype.TypeOfType(rt.Elem())
   279  	ptrto := xtype.TypeOfType(rt)
   280  	r := xtype.New(typ, ptrto)
   281  	if s := fmt.Sprintf("%T %v", r, *(r.(*T))); s != "*fmt.Stringer <nil>" {
   282  		panic(s)
   283  	}
   284  }
   285  
   286  type N int
   287  
   288  func fntest(n N) N {
   289  	return n + 100
   290  }
   291  
   292  func TestConvertFunc(t *testing.T) {
   293  	fn := reflect.ValueOf(fntest)
   294  	typ := reflect.TypeOf((*func(int) int)(nil)).Elem()
   295  	v := xtype.ConvertFunc(fn, xtype.TypeOfType(typ))
   296  	if fn.Type() == typ {
   297  		t.Fatal("change org type")
   298  	}
   299  	if v.Type() != typ {
   300  		t.Fatalf("error %v != %v", v.Type(), typ)
   301  	}
   302  	if n := v.Interface().(func(int) int)(100); n != 200 {
   303  		t.Fatalf("error %v != 200", n)
   304  	}
   305  }