@@ -29,7 +29,7 @@ fn mk<T:Eq IterBytes Hash Const Copy>() -> Interner<T> {
29
29
move ( ( move hi) as Interner :: < T > )
30
30
}
31
31
32
- fn mk_prefill < T : Eq IterBytes Hash Const Copy > ( init : ~ [ T ] ) -> Interner < T > {
32
+ fn mk_prefill < T : Eq IterBytes Hash Const Copy > ( init : & [ T ] ) -> Interner < T > {
33
33
let rv = mk ( ) ;
34
34
for init. each( ) |v| { rv. intern ( * v) ; }
35
35
return rv;
@@ -70,3 +70,45 @@ impl <T:Eq IterBytes Hash Const Copy> hash_interner<T>: Interner<T> {
70
70
71
71
fn len ( ) -> uint { return self . vect . len ( ) ; }
72
72
}
73
+
74
+
75
+ #[ test]
76
+ #[ should_fail]
77
+ fn i1 ( ) {
78
+ let i : Interner < @~str > = mk ( ) ;
79
+ i. get ( 13 ) ;
80
+ }
81
+
82
+ #[ test]
83
+ fn i2 ( ) {
84
+ let i : Interner < @~str > = mk ( ) ;
85
+ // first one is zero:
86
+ assert i. intern ( @~"dog") == 0 ;
87
+ // re-use gets the same entry:
88
+ assert i. intern ( @~"dog") == 0 ;
89
+ // different string gets a different #:
90
+ assert i. intern ( @~"cat") == 1 ;
91
+ assert i. intern ( @~"cat") == 1 ;
92
+ // dog is still at zero
93
+ assert i. intern ( @~"dog") == 0 ;
94
+ // gensym gets 3
95
+ assert i. gensym ( @~"zebra" ) == 2 ;
96
+ // gensym of same string gets new number :
97
+ assert i. gensym ( @~"zebra" ) == 3 ;
98
+ // gensym of *existing* string gets new number:
99
+ assert i. gensym ( @~"dog") == 4 ;
100
+ assert i. get ( 0 ) == @~"dog";
101
+ assert i. get ( 1 ) == @~"cat";
102
+ assert i. get ( 2 ) == @~"zebra";
103
+ assert i. get ( 3 ) == @~"zebra";
104
+ assert i. get ( 4 ) == @~"dog";
105
+ }
106
+
107
+ #[ test]
108
+ fn i3 ( ) {
109
+ let i : Interner < @~str > = mk_prefill ( [ @~"Alan ", @~"Bob ", @~"Carol "] ) ;
110
+ assert i. get ( 0 ) == @~"Alan ";
111
+ assert i. get ( 1 ) == @~"Bob ";
112
+ assert i. get ( 2 ) == @~"Carol ";
113
+ assert i. intern ( @~"Bob ") == 1 ;
114
+ }
0 commit comments