safestruct 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 566fae2d8f89cb24afd577666383dd7944811152
4
- data.tar.gz: 6b72e279ae328f1fdac760691ad57d92e991ab21
3
+ metadata.gz: e972352c0dbb2c3684a3de9385f33efb706a7cca
4
+ data.tar.gz: 9fb3502f891afab88650aa288bfc39d84ac5f236
5
5
  SHA512:
6
- metadata.gz: f756d180e311fef89fc4325bcb873bcaaaa02e73cba6ce8d34081352ff46a99307e76470dadec5ede89ab7ea7869d8d1f8a70260860c452f4a5a8783165bd5c2
7
- data.tar.gz: bf9226fd8c07a2f63ee309e5b6ebbd7da7551bcaf350691bf715c9ebb8c7e48250b9b88765ad1dbf8d7c09ee07f46b6e3d39e63684276e759529187e7cbc15e4
6
+ metadata.gz: de271ceb36e33cf627911d60e69c5120e2e8cde48ac84d1ef258571a98e36757695345b4e3ac58a77e0086e76f8ad393a13a6567f8b738fe380c41a47c63bb94
7
+ data.tar.gz: 4863ee4959e548d6686ca1020b8be99897a0945ebb3eef35becc7bc77d028ba1858d0d2c9b4e6f9b9066baedf636c6c3b2911aaa8a49d1e1b33bda9c2b6420e8
@@ -67,8 +67,8 @@ class Array
67
67
  ## note: for nested Hash.of or Array.of a ("prototype") object
68
68
  ## gets passed in (NOT class) - auto-convert to use class
69
69
  klass_value = klass_or_proto_value.is_a?( Class ) ? klass_or_proto_value : klass_or_proto_value.class
70
- klass = Safe::SafeArray.build_class( klass_value )
71
- klass.new( size )
70
+ klass = Safe::SafeArray.build_class( klass_value, size )
71
+ klass.new
72
72
  end
73
73
  end
74
74
 
@@ -5,14 +5,15 @@ module Safe
5
5
  class SafeArray
6
6
 
7
7
  ## e.g.
8
- ## Array.of( Address ), Array.of( Integer), etc.
9
-
10
- def self.build_class( klass_value )
11
- ## note: care for now only about value type / class
8
+ ## Array.of( Address ), Array.of( Integer),
9
+ ## Array.of( Integer, 3 ) or Array.of( Integer, 3*3 ) etc.
12
10
 
11
+ def self.build_class( klass_value, size=0 )
13
12
  ## note: keep a class cache
14
- cache = @@cache ||= {}
15
- klass = cache[ klass_value ]
13
+ ## note: klasses may have different init sizes (default 0)
14
+ cache = @@cache ||= {}
15
+ cache_all_sizes = cache[ klass_value ] ||= {}
16
+ klass = cache_all_sizes[ size ]
16
17
 
17
18
  if klass.nil?
18
19
 
@@ -21,9 +22,12 @@ class SafeArray
21
22
  def self.klass_value
22
23
  @klass_value ||= #{klass_value}
23
24
  end
25
+ def self.klass_size
26
+ @klass_size ||= #{size}
27
+ end
24
28
  RUBY
25
29
  ## add to cache for later (re)use
26
- cache[ klass_value ] = klass
30
+ cache[ klass_value ][ size ] = klass
27
31
  end
28
32
  klass
29
33
  end
@@ -33,9 +37,7 @@ RUBY
33
37
  def self.zero() @zero ||= new_zero.freeze; end
34
38
 
35
39
 
36
-
37
- def initialize( size=0 )
38
- ## todo/check: if array works if value is a (nested/multi-dimensional) array
40
+ def initialize( size=self.class.klass_size )
39
41
  @ary = []
40
42
  self.size = size if size > 0 ## auto-init with zeros
41
43
  self # return reference to self
@@ -102,8 +104,17 @@ RUBY
102
104
  @ary.size
103
105
  end
104
106
 
107
+ def clear
108
+ ## note: reset ary to zero (NOT empty e.g. [])
109
+ ## differes for "fixed" size arrays
110
+ @ary = []
111
+ self.size = self.class.klass_size if self.class.klass_size > 0 ## auto-init with zeros
112
+ self # return reference to self
113
+ end
114
+
115
+
105
116
  extend Forwardable
106
- def_delegators :@ary, :size, :length, :clear,
117
+ def_delegators :@ary, :size, :length,
107
118
  :each, :each_with_index
108
119
 
109
120
 
@@ -5,7 +5,7 @@ module Safe
5
5
 
6
6
  MAJOR = 1
7
7
  MINOR = 1
8
- PATCH = 0
8
+ PATCH = 1
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
@@ -18,6 +18,10 @@ class TestArray < MiniTest::Test
18
18
  ## multi-dimensional / nested array
19
19
  Array_Array_Integer = SafeArray.build_class( Array_Integer )
20
20
 
21
+ ## "fixed" size
22
+ Array_3_Integer = SafeArray.build_class( Integer, 3 )
23
+ Array_Array_3x3_Integer = SafeArray.build_class( Array_3_Integer, 3 )
24
+
21
25
 
22
26
  def test_push_and_clear
23
27
  ary = Array_Integer.new
@@ -40,6 +44,7 @@ def test_integer
40
44
  pp ary = Array_Integer.new(2)
41
45
 
42
46
  assert_equal Integer, Array_Integer.klass_value
47
+ assert_equal 0, Array_Integer.klass_size
43
48
  assert_equal 0, ary[0]
44
49
  assert_equal 0, ary[1]
45
50
 
@@ -56,14 +61,15 @@ def test_integer
56
61
  ary.each_with_index { |item,i| puts "[#{i}] #{item}"}
57
62
 
58
63
  ary.size = 3
59
- assert_equal 3, ary.size
60
- assert_equal 0, ary[2]
61
- assert Array_Integer.zero != ary
64
+ assert_equal 3, ary.size
65
+ assert_equal 0, ary[2]
66
+ assert_equal false, Array_Integer.zero == ary
62
67
 
63
68
  pp Array_Integer.zero
64
- assert_equal true, Array_Integer.zero.frozen?
65
- assert_equal Array_Integer.zero, Array_Integer.zero
66
- assert_equal Array_Integer.zero, Array_Integer.new
69
+ assert_equal true, Array_Integer.zero.frozen?
70
+ assert_equal true, Array_Integer.zero == Array_Integer.zero
71
+ assert_equal true, Array_Integer.zero == Array_Integer.new
72
+ assert_equal true, Array_Integer.zero == Array_Integer.new_zero
67
73
 
68
74
  ## check Array.of (uses cached classes)
69
75
  assert_equal Array_Integer, Array.of( Integer ).class
@@ -75,6 +81,7 @@ def test_bool
75
81
  pp ary = Array_Bool.new(2)
76
82
 
77
83
  assert_equal Bool, Array_Bool.klass_value
84
+ assert_equal 0, Array_Bool.klass_size
78
85
  assert_equal false, ary[0]
79
86
  assert_equal false, ary[1]
80
87
 
@@ -96,10 +103,6 @@ def test_array_of
96
103
  end
97
104
 
98
105
  def test_multi # nested (multi-dimensional) array
99
- ## todo/fix: try with size: 3 e.g. 3x3
100
- ## make it work with size too!!!!!
101
- ## remember size if passed in in c'tor!!!!!!
102
-
103
106
  multi = Array_Array_Integer.new
104
107
  multi.push( Array_Integer.new )
105
108
  multi[0].push( 100 )
@@ -138,4 +141,87 @@ def test_multi # nested (multi-dimensional) array
138
141
  assert_equal 0, multi.size
139
142
  end
140
143
 
144
+ def test_3x3 # nested (multi-dimensional) array
145
+ board = Array_Array_3x3_Integer.new
146
+ pp board
147
+
148
+ assert_equal Integer, Array_3_Integer.klass_value
149
+ assert_equal 3, Array_3_Integer.klass_size
150
+
151
+ assert_equal Array_3_Integer, Array_Array_3x3_Integer.klass_value
152
+ assert_equal 3, Array_Array_3x3_Integer.klass_size
153
+
154
+ assert_equal 0, board[0][0]
155
+ assert_equal 0, board[0][1]
156
+ assert_equal 0, board[0][2]
157
+ assert_equal 0, board[1][0]
158
+ assert_equal 0, board[1][1]
159
+ assert_equal 0, board[1][2]
160
+ assert_equal 0, board[2][0]
161
+ assert_equal 0, board[2][1]
162
+ assert_equal 0, board[2][2]
163
+
164
+ board[0][0] = 1
165
+ board[0][1] = 2
166
+ board[0][2] = 1
167
+ board[1][0] = 2
168
+ pp board
169
+
170
+ assert_equal 1, board[0][0]
171
+ assert_equal 2, board[0][1]
172
+ assert_equal 1, board[0][2]
173
+ assert_equal 2, board[1][0]
174
+
175
+ board[0].clear
176
+ pp board[0]
177
+ assert_equal 3, board[0].size
178
+ assert_equal 0, board[0][0]
179
+ assert_equal 0, board[0][1]
180
+ assert_equal 0, board[0][2]
181
+
182
+ board.clear
183
+ assert_equal 3, board.size
184
+ assert_equal 3, board[0].size
185
+ assert_equal 3, board[1].size
186
+ assert_equal 3, board[2].size
187
+
188
+ assert_equal 0, board[0][0]
189
+ assert_equal 0, board[0][1]
190
+ assert_equal 0, board[0][2]
191
+ assert_equal 0, board[1][0]
192
+ assert_equal 0, board[1][1]
193
+ assert_equal 0, board[1][2]
194
+ assert_equal 0, board[2][0]
195
+ assert_equal 0, board[2][1]
196
+ assert_equal 0, board[2][2]
197
+
198
+ ##############################################
199
+ ## try Array.of convenience helper
200
+
201
+ board = Array.of( Array.of( Integer, 3 ), 3 )
202
+ pp board
203
+
204
+ assert_equal 0, board[0][0]
205
+ assert_equal 0, board[0][1]
206
+ assert_equal 0, board[0][2]
207
+ assert_equal 0, board[1][0]
208
+ assert_equal 0, board[1][1]
209
+ assert_equal 0, board[1][2]
210
+ assert_equal 0, board[2][0]
211
+ assert_equal 0, board[2][1]
212
+ assert_equal 0, board[2][2]
213
+
214
+ board[0][0] = 1
215
+ board[0][1] = 2
216
+ board[0][2] = 1
217
+ board[1][0] = 2
218
+ pp board
219
+
220
+ assert_equal 1, board[0][0]
221
+ assert_equal 2, board[0][1]
222
+ assert_equal 1, board[0][2]
223
+ assert_equal 2, board[1][0]
224
+ end
225
+
226
+
141
227
  end # class TestArray
@@ -33,8 +33,9 @@ def test_integer
33
33
  assert_equal 0, h.instance_variable_get('@h').size
34
34
  assert_equal 0, h.instance_variable_get('@h').length
35
35
 
36
- assert_equal Hash_X_Integer.zero, h
37
- assert_equal Hash_X_Integer.zero, Hash_X_Integer.new
36
+ assert_equal true, Hash_X_Integer.zero == h
37
+ assert_equal true, Hash_X_Integer.zero == Hash_X_Integer.new
38
+ assert_equal true, Hash_X_Integer.zero == Hash_X_Integer.new_zero
38
39
 
39
40
  pp Hash_X_Integer.zero
40
41
  assert_equal true, Hash_X_Integer.zero.frozen?
@@ -79,8 +80,8 @@ def test_voter
79
80
  pp h = Hash_X_Voter.new
80
81
 
81
82
  assert_equal Voter, Hash_X_Voter.klass_value
82
- assert_equal Voter.zero, h['0x1111']
83
- assert_equal Voter.zero, h['0x2222']
83
+ assert_equal true, Voter.zero == h['0x1111']
84
+ assert_equal true, Voter.zero == h['0x2222']
84
85
 
85
86
  h['0x1111'].voted = true
86
87
  h['0x2222'].voted = true
@@ -19,37 +19,85 @@ Voter = SafeStruct.new( weight: 0, voted: false, vote: 0, delegate: '0x0000' )
19
19
  Bet = SafeStruct.new( user: '0x0000', block: 0, cap: 0, amount: 0 )
20
20
 
21
21
 
22
+
23
+ ### test with "real" enum
24
+ class Enum
25
+ def initialize( key, value )
26
+ @key = key
27
+ @value = value
28
+ end
29
+ end
30
+
31
+ class Winner < Enum
32
+ NONE = new(:none, 0 )
33
+ DRAW = new(:draw, 1 )
34
+ HOST = new(:host, 2 )
35
+ CHALLENGER = new(:challenger, 3)
36
+
37
+ def self.none() NONE; end
38
+ def self.draw() DRAW; end
39
+ def self.host() HOST; end
40
+ def self.challenger() CHALLENGER; end
41
+
42
+ def none?() self == NONE; end
43
+ def draw?() self == DRAW; end
44
+ def host?() self == HOST; end
45
+ def challenger?() self == CHALLENGER; end
46
+ end
47
+
48
+ Board = Array_9_Integer = SafeArray.build_class( Integer, 3*3 )
49
+
50
+ ## sig: [Address, Address, Address, Winner(Enum), Board(Array9)]
51
+ Game = SafeStruct.new( host: '0x0000',
52
+ challenger: '0x0000',
53
+ turn: '0x0000', ## address of host/ challenger
54
+ winner: Winner.none,
55
+ board: Board.zero
56
+ )
57
+
22
58
  def test_voter
23
- assert_equal Voter.zero, Voter.zero
59
+ assert_equal true, Voter.zero.frozen?
60
+ assert_equal true, Voter.zero == Voter.zero
61
+
24
62
  assert_equal '0x0000', Voter.zero.delegate
25
63
  assert_equal false, Voter.zero.voted?
26
64
  assert_equal 0, Voter.zero.weight
27
65
  assert_equal 0, Voter.zero.vote
28
- assert_equal true, Voter.zero.frozen?
29
66
 
30
67
  voter = Voter.new_zero
31
68
 
32
69
  assert_equal false, voter.frozen?
33
- assert_equal Voter.zero, voter
34
- assert Voter.zero == voter
35
- assert Voter.zero.eql?( voter )
70
+ assert_equal true, Voter.zero == voter
71
+ assert_equal true, Voter.zero.eql?( voter )
72
+ assert_equal true, Voter.zero == Voter.new
73
+ assert_equal true, Voter.zero == Voter.new_zero
74
+
36
75
 
37
76
  voter.delegate = '0x1111'
38
77
  pp voter
39
78
 
40
- assert Voter.zero != voter
79
+ assert_equal false, Voter.zero == voter
41
80
 
42
- voter2 = Voter.new( 0, false, 0, '0x0000' )
43
- assert_equal Voter.zero, voter2
44
- assert_equal false, voter2.frozen?
81
+ ##############
82
+ # try a new voter
83
+ voter = Voter.new( 0, false, 0, '0x0000' )
84
+ assert_equal true, Voter.zero == voter
85
+ assert_equal false, voter.frozen?
45
86
  end
46
87
 
88
+
47
89
  def test_bet
48
90
  pp Bet
91
+ assert_equal true, Bet.zero.frozen?
92
+ assert_equal true, Bet.zero == Bet.zero
93
+
94
+
49
95
  bet = Bet.new_zero
50
96
  pp bet
51
97
 
52
- assert_equal Bet.zero, bet
98
+ assert_equal true, Bet.zero == bet
99
+ assert_equal true, Bet.zero == Bet.new
100
+ assert_equal true, Bet.zero == Bet.new_zero
53
101
 
54
102
  bet.cap = 20_000
55
103
  bet.amount = 100
@@ -57,23 +105,69 @@ def test_bet
57
105
  assert_equal false, bet.frozen?
58
106
  assert_equal 20_000, bet.cap
59
107
  assert_equal 100, bet.amount
60
- assert Bet.zero != bet
108
+ assert_equal false, Bet.zero == bet
61
109
 
62
110
  pp bet
63
111
 
64
112
  pp Bet.zero
65
113
  pp Bet.zero
66
114
 
67
- assert_equal Bet.zero, Bet.zero
115
+ assert_equal true, Bet.zero == Bet.zero
68
116
  assert_equal '0x0000', Bet.zero.user
69
117
  assert_equal 0, Bet.zero.block
70
118
  assert_equal 0, Bet.zero.cap
71
119
  assert_equal 0, Bet.zero.amount
72
120
  assert_equal true, Bet.zero.frozen?
73
121
 
74
- bet2 = Bet.new( '0x0000', 0, 0, 0 )
75
- assert_equal Bet.zero, bet2
76
- assert_equal false, bet2.frozen?
122
+ #############################
123
+ # try a new bet
124
+ bet = Bet.new( '0x0000', 0, 0, 0 )
125
+ assert_equal true, Bet.zero == bet
126
+ assert_equal false, bet.frozen?
127
+ end
128
+
129
+ def test_game
130
+ pp Game
131
+ assert_equal true, Game.zero.frozen?
132
+ assert_equal true, Game.zero == Game.zero
133
+
134
+ game = Game.new_zero
135
+ pp game
136
+
137
+ assert_equal true, Game.zero == game
138
+ assert_equal true, Game.zero == Game.new
139
+ assert_equal true, Game.zero == Game.new_zero
140
+ assert_equal false, game.frozen?
141
+
142
+ assert_equal '0x0000', game.host
143
+ assert_equal '0x0000', game.challenger
144
+ assert_equal '0x0000', game.turn
145
+ assert_equal Winner.none, game.winner
146
+ assert_equal true, game.winner.none?
147
+ assert_equal Board.zero, game.board
148
+ assert_equal 9, game.board.size
149
+ assert_equal 0, game.board[0]
150
+ assert_equal 0, game.board[1]
151
+ assert_equal 0, game.board[2]
152
+ assert_equal 0, game.board[3]
153
+ assert_equal 0, game.board[4]
154
+ assert_equal 0, game.board[5]
155
+ assert_equal 0, game.board[6]
156
+ assert_equal 0, game.board[7]
157
+ assert_equal 0, game.board[8]
158
+
159
+
160
+ game.winner = Winner.host
161
+ assert_equal false, Game.zero == game
162
+ pp game
163
+
164
+ #####
165
+ # try a new game
166
+ game = Game.new
167
+ game.board[0] = 1
168
+ assert_equal false, Game.zero == game
169
+ pp game
77
170
  end
78
171
 
172
+
79
173
  end # class TestStruct
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safestruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer