]> Cypherpunks repositories - gostls13.git/commitdiff
test of named operations
authorRuss Cox <rsc@golang.org>
Tue, 22 Sep 2009 05:45:19 +0000 (22:45 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 22 Sep 2009 05:45:19 +0000 (22:45 -0700)
R=r
DELTA=305  (305 added, 0 deleted, 0 changed)
OCL=34848
CL=34875

test/named.go [new file with mode: 0644]

diff --git a/test/named.go b/test/named.go
new file mode 100644 (file)
index 0000000..47a1032
--- /dev/null
@@ -0,0 +1,305 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that basic operations on named types are valid
+// and preserve the type.
+
+package main
+
+type Array [10]byte
+type Bool bool
+type Chan chan int
+type Float float
+type Int int
+type Map map[int]byte
+type Slice []byte
+type String string
+
+// Calling these functions checks at compile time that the argument
+// can be converted implicitly to (used as) the given type.
+func asArray(Array) {}
+func asBool(Bool) {}
+func asChan(Chan) {}
+func asFloat(Float) {}
+func asInt(Int) {}
+func asMap(Map) {}
+func asSlice(Slice) {}
+func asString(String) {}
+
+func (Map) M() {}
+
+
+// These functions check at run time that the default type
+// (in the absence of any implicit conversion hints)
+// is the given type.
+func isArray(x interface{}) { _ = x.(Array) }
+func isBool(x interface{}) { _ = x.(Bool) }
+func isChan(x interface{}) { _ = x.(Chan) }
+func isFloat(x interface{}) { _ = x.(Float) }
+func isInt(x interface{}) { _ = x.(Int) }
+func isMap(x interface{}) { _ = x.(Map) }
+func isSlice(x interface{}) { _ = x.(Slice) }
+func isString(x interface{}) { _ = x.(String) }
+
+func main() {
+       var (
+               a Array;
+               b Bool = true;
+               c Chan = make(Chan);
+               f Float = 1;
+               i Int = 1;
+               m Map = make(Map);
+               slice Slice = make(Slice, 10);
+               str String = "hello";
+       )
+
+       asArray(a);
+       isArray(a);
+       asArray(*&a);
+       isArray(*&a);
+       asArray(Array{});
+       isArray(Array{});
+
+       asBool(b);
+       isBool(b);
+       asBool(!b);
+       isBool(!b);
+       asBool(true);
+       asBool(1!=2);
+       asBool(*&b);
+       isBool(*&b);
+       asBool(Bool(true));
+       isBool(Bool(true));
+       asBool(i < Int(f));
+
+       _, b = m[2];
+       m[2] = 1, b;
+
+       b = c<-1;
+       _ = b;
+       asBool(c<-1);
+
+       _, b = <-c;
+       _ = b;
+
+       var inter interface{};
+       _, b = inter.(Map);
+       _ = b;
+
+       var minter interface{M()};
+       _, b = minter.(Map);
+       _ = b;
+
+       asBool(closed(c));
+       b = closed(c);
+       _ = b;
+
+       asChan(c);
+       isChan(c);
+       asChan(make(Chan));
+       isChan(make(Chan));
+       asChan(*&c);
+       isChan(*&c);
+       asChan(Chan(nil));
+       isChan(Chan(nil));
+
+       asFloat(f);
+       isFloat(f);
+       asFloat(-f);
+       isFloat(-f);
+       asFloat(+f);
+       isFloat(+f);
+       asFloat(f+1);
+       isFloat(f+1);
+       asFloat(1+f);
+       isFloat(1+f);
+       asFloat(f+f);
+       isFloat(f+f);
+       f++;
+       f+=2;
+       asFloat(f-1);
+       isFloat(f-1);
+       asFloat(1-f);
+       isFloat(1-f);
+       asFloat(f-f);
+       isFloat(f-f);
+       f--;
+       f-=2;
+       asFloat(f*2.5);
+       isFloat(f*2.5);
+       asFloat(2.5*f);
+       isFloat(2.5*f);
+       asFloat(f*f);
+       isFloat(f*f);
+       f*=4;
+       asFloat(f/2.5);
+       isFloat(f/2.5);
+       asFloat(2.5/f);
+       isFloat(2.5/f);
+       asFloat(f/f);
+       isFloat(f/f);
+       f/=4;
+       asFloat(f);
+       isFloat(f);
+       f = 5;
+       asFloat(*&f);
+       isFloat(*&f);
+       asFloat(234);
+       asFloat(Float(234));
+       isFloat(Float(234));
+       asFloat(1.2);
+       asFloat(Float(i));
+       isFloat(Float(i));
+
+       asInt(i);
+       isInt(i);
+       asInt(-i);
+       isInt(-i);
+       asInt(^i);
+       isInt(^i);
+       asInt(+i);
+       isInt(+i);
+       asInt(i+1);
+       isInt(i+1);
+       asInt(1+i);
+       isInt(1+i);
+       asInt(i+i);
+       isInt(i+i);
+       i++;
+       i+=1;
+       asInt(i-1);
+       isInt(i-1);
+       asInt(1-i);
+       isInt(1-i);
+       asInt(i-i);
+       isInt(i-i);
+       i--;
+       i-=1;
+       asInt(i*2);
+       isInt(i*2);
+       asInt(2*i);
+       isInt(2*i);
+       asInt(i*i);
+       isInt(i*i);
+       i*=2;
+       asInt(i/5);
+       isInt(i/5);
+       asInt(5/i);
+       isInt(5/i);
+       asInt(i/i);
+       isInt(i/i);
+       i/=2;
+       asInt(i%5);
+       isInt(i%5);
+       asInt(5%i);
+       isInt(5%i);
+       asInt(i%i);
+       isInt(i%i);
+       i%=2;
+       asInt(i&5);
+       isInt(i&5);
+       asInt(5&i);
+       isInt(5&i);
+       asInt(i&i);
+       isInt(i&i);
+       i&=2;
+       asInt(i&^5);
+       isInt(i&^5);
+       asInt(5&^i);
+       isInt(5&^i);
+       asInt(i&^i);
+       isInt(i&^i);
+       i&^=2;
+       asInt(i|5);
+       isInt(i|5);
+       asInt(5|i);
+       isInt(5|i);
+       asInt(i|i);
+       isInt(i|i);
+       i|=2;
+       asInt(i^5);
+       isInt(i^5);
+       asInt(5^i);
+       isInt(5^i);
+       asInt(i^i);
+       isInt(i^i);
+       i^=2;
+       asInt(i<<4);
+       isInt(i<<4);
+       i<<=2;
+       asInt(i>>4);
+       isInt(i>>4);
+       i>>=2;
+       asInt(i);
+       isInt(i);
+       asInt(0);
+       asInt(Int(0));
+       isInt(Int(0));
+       i = 10;
+       asInt(*&i);
+       isInt(*&i);
+       asInt(23);
+       asInt(Int(f));
+       isInt(Int(f));
+
+       asMap(m);
+       isMap(m);
+       asMap(nil);
+       m = nil;
+       asMap(make(Map));
+       isMap(make(Map));
+       asMap(*&m);
+       isMap(*&m);
+       asMap(Map(nil));
+       isMap(Map(nil));
+       asMap(Map{});
+       isMap(Map{});
+
+       asSlice(slice);
+       isSlice(slice);
+       asSlice(make(Slice, 5));
+       isSlice(make(Slice, 5));
+       asSlice([]byte{1,2,3});
+       asSlice([]byte{1,2,3}[0:2]);
+       asSlice(slice[0:4]);
+       isSlice(slice[0:4]);
+       asSlice(slice[3:8]);
+       isSlice(slice[3:8]);
+       asSlice(nil);
+       asSlice(Slice(nil));
+       isSlice(Slice(nil));
+       slice = nil;
+       asSlice(Slice{1,2,3});
+       isSlice(Slice{1,2,3});
+       asSlice(Slice{});
+       isSlice(Slice{});
+       asSlice(*&slice);
+       isSlice(*&slice);
+
+       asString(str);
+       isString(str);
+       asString(str+"a");
+       isString(str+"a");
+       asString("a"+str);
+       isString("a"+str);
+       asString(str+str);
+       isString(str+str);
+       str += "a";
+       str += str;
+       asString(String('a'));
+       isString(String('a'));
+       asString(String(slice));
+       isString(String(slice));
+       asString(String([]byte(nil)));
+       isString(String([]byte(nil)));
+       asString("hello");
+       asString(String("hello"));
+       isString(String("hello"));
+       str = "hello";
+       isString(str);
+       asString(*&str);
+       isString(*&str);
+}