universum 0.2.0 → 0.3.0
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 +4 -4
- data/Manifest.txt +1 -5
- data/Rakefile +1 -0
- data/lib/universum.rb +5 -3
- data/lib/universum/convert.rb +26 -0
- data/lib/universum/event.rb +1 -0
- data/lib/universum/type.rb +1 -39
- data/lib/universum/version.rb +1 -1
- data/test/test_event.rb +2 -0
- metadata +17 -7
- data/lib/universum/safe_array.rb +0 -69
- data/lib/universum/safe_hash.rb +0 -77
- data/test/test_array.rb +0 -52
- data/test/test_hash.rb +0 -84
- data/test/test_struct.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70d14cee1fae619bb93bdf56c7a81b79987f16bb
|
4
|
+
data.tar.gz: 8ed7b6fde7aabaeb6430ebbc61c1863e50241064
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a06807b4ff6cd4a8b4d84dc688e8a9af995a08135aaca0fcf8b1f1d0c249cf0530560ca901ebcf9c189e4b11131037cd1862369e956a5117ac5a5ef9216287c
|
7
|
+
data.tar.gz: e3e45a313da7ee2c0e0094f61c5fc082e015b8a5d0dfcc3e291decbd430d48746fa10f0ad4db4f6fca171413fd6cb8a3af3aff5949e328ffddafe879fa731995
|
data/Manifest.txt
CHANGED
@@ -7,12 +7,11 @@ lib/universum.rb
|
|
7
7
|
lib/universum/account.rb
|
8
8
|
lib/universum/address.rb
|
9
9
|
lib/universum/contract.rb
|
10
|
+
lib/universum/convert.rb
|
10
11
|
lib/universum/enum.rb
|
11
12
|
lib/universum/event.rb
|
12
13
|
lib/universum/function.rb
|
13
14
|
lib/universum/receipt.rb
|
14
|
-
lib/universum/safe_array.rb
|
15
|
-
lib/universum/safe_hash.rb
|
16
15
|
lib/universum/transaction.rb
|
17
16
|
lib/universum/type.rb
|
18
17
|
lib/universum/units_money.rb
|
@@ -22,12 +21,9 @@ lib/universum/version.rb
|
|
22
21
|
test/contracts/greeter.rb
|
23
22
|
test/contracts/mytoken.rb
|
24
23
|
test/helper.rb
|
25
|
-
test/test_array.rb
|
26
24
|
test/test_enum.rb
|
27
25
|
test/test_event.rb
|
28
26
|
test/test_greeter.rb
|
29
|
-
test/test_hash.rb
|
30
|
-
test/test_struct.rb
|
31
27
|
test/test_units_money.rb
|
32
28
|
test/test_units_time.rb
|
33
29
|
test/test_version.rb
|
data/Rakefile
CHANGED
data/lib/universum.rb
CHANGED
@@ -9,6 +9,10 @@ require 'time'
|
|
9
9
|
require 'uri'
|
10
10
|
|
11
11
|
|
12
|
+
## 3rd party gems
|
13
|
+
require 'safestruct' # SafeArray, SafeHash, SafeStruct, etc.
|
14
|
+
|
15
|
+
|
12
16
|
|
13
17
|
## our own code
|
14
18
|
require 'universum/version' # note: let version always go first
|
@@ -16,9 +20,6 @@ require 'universum/version' # note: let version always go first
|
|
16
20
|
require 'universum/units_time'
|
17
21
|
require 'universum/units_money'
|
18
22
|
|
19
|
-
require 'universum/safe_array'
|
20
|
-
require 'universum/safe_hash'
|
21
|
-
|
22
23
|
require 'universum/enum'
|
23
24
|
require 'universum/event'
|
24
25
|
|
@@ -33,6 +34,7 @@ require 'universum/receipt'
|
|
33
34
|
|
34
35
|
require 'universum/universum'
|
35
36
|
|
37
|
+
require 'universum/convert'
|
36
38
|
|
37
39
|
|
38
40
|
puts Universum.banner ## say hello
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# e.g. use Address(0)
|
5
|
+
|
6
|
+
def Address( arg )
|
7
|
+
if arg == 0 || arg == '0x0' || arg == '0x0000'
|
8
|
+
'0x0000' ## note: return a string for now and NOT (typed) Address.zero
|
9
|
+
else
|
10
|
+
## assume string (hex) address
|
11
|
+
## pass through for now
|
12
|
+
##
|
13
|
+
## use an address lookup in the future - why? why not?
|
14
|
+
## Address.find_by_address( arg )
|
15
|
+
arg
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
###
|
22
|
+
## todo - add a global method_missing handler for (auto-)adding converters for Structs - why? why not?
|
23
|
+
## e.g. how to auto-create Vote(0) for Vote.zero or Bet(0) for Bet.zero and so on - why? why not?
|
24
|
+
##
|
25
|
+
## def Vote( arg ) Vote.zero; end
|
26
|
+
|
data/lib/universum/event.rb
CHANGED
data/lib/universum/type.rb
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
|
4
|
-
## add dummy
|
5
|
-
|
6
|
-
class Integer
|
7
|
-
def self.zero() 0; end
|
8
|
-
end
|
9
|
-
|
10
|
-
class Bool
|
11
|
-
def self.zero() false; end
|
12
|
-
end
|
4
|
+
## add more dummy classes for mapping and (payable) method signature
|
13
5
|
|
14
6
|
class Money
|
15
7
|
def self.zero() 0; end
|
@@ -17,33 +9,3 @@ end
|
|
17
9
|
|
18
10
|
class Void ## only used (reserved) for (payable) method signature now
|
19
11
|
end
|
20
|
-
|
21
|
-
|
22
|
-
class Mapping
|
23
|
-
|
24
|
-
def self.of( *args )
|
25
|
-
## e.g. gets passed in [{Address=>Integer}]
|
26
|
-
## check for Integer - use Hash.new(0)
|
27
|
-
## check for Bool - use Hash.new(False)
|
28
|
-
if args[0].is_a? Hash
|
29
|
-
arg = args[0].to_a ## convert to array (for easier access)
|
30
|
-
klass_key = arg[0][0]
|
31
|
-
klass_value = arg[0][1]
|
32
|
-
klass = SafeHash.build_class( klass_key, klass_value )
|
33
|
-
klass.new
|
34
|
-
else
|
35
|
-
## todo/fix: throw argument error/exception
|
36
|
-
Hash.new ## that is, "plain" {} with all "standard" defaults
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
class Array
|
43
|
-
## "typed" safe array "constructor"
|
44
|
-
## e.g. Array.of( Address ) or Array.of( Money ) or Array.of( Proposal, size: 2 ) etc.
|
45
|
-
def self.of( klass_value )
|
46
|
-
klass = SafeArray.build_class( klass_value )
|
47
|
-
klass.new ## todo: add klass.new( **kwargs ) for size: 2 etc.
|
48
|
-
end
|
49
|
-
end
|
data/lib/universum/version.rb
CHANGED
data/test/test_event.rb
CHANGED
@@ -24,6 +24,7 @@ def test_bet_placed
|
|
24
24
|
assert_equal '0xaaaa', bet.user
|
25
25
|
assert_equal 2000, bet.cap
|
26
26
|
assert_equal 100, bet.amount
|
27
|
+
assert_equal true, bet.frozen?
|
27
28
|
end
|
28
29
|
|
29
30
|
def test_roll
|
@@ -33,6 +34,7 @@ def test_roll
|
|
33
34
|
assert roll.is_a?( Event )
|
34
35
|
assert_equal 1, roll.id
|
35
36
|
assert_equal 2345, roll.rolled
|
37
|
+
assert_equal true, roll.frozen?
|
36
38
|
end
|
37
39
|
|
38
40
|
end # class TestEvent
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: universum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: safestruct
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rdoc
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,12 +74,11 @@ files:
|
|
60
74
|
- lib/universum/account.rb
|
61
75
|
- lib/universum/address.rb
|
62
76
|
- lib/universum/contract.rb
|
77
|
+
- lib/universum/convert.rb
|
63
78
|
- lib/universum/enum.rb
|
64
79
|
- lib/universum/event.rb
|
65
80
|
- lib/universum/function.rb
|
66
81
|
- lib/universum/receipt.rb
|
67
|
-
- lib/universum/safe_array.rb
|
68
|
-
- lib/universum/safe_hash.rb
|
69
82
|
- lib/universum/transaction.rb
|
70
83
|
- lib/universum/type.rb
|
71
84
|
- lib/universum/units_money.rb
|
@@ -75,12 +88,9 @@ files:
|
|
75
88
|
- test/contracts/greeter.rb
|
76
89
|
- test/contracts/mytoken.rb
|
77
90
|
- test/helper.rb
|
78
|
-
- test/test_array.rb
|
79
91
|
- test/test_enum.rb
|
80
92
|
- test/test_event.rb
|
81
93
|
- test/test_greeter.rb
|
82
|
-
- test/test_hash.rb
|
83
|
-
- test/test_struct.rb
|
84
94
|
- test/test_units_money.rb
|
85
95
|
- test/test_units_time.rb
|
86
96
|
- test/test_version.rb
|
data/lib/universum/safe_array.rb
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
class SafeArray
|
4
|
-
|
5
|
-
## e.g.
|
6
|
-
## Array.of( Address ), Array.of( Integer), etc.
|
7
|
-
|
8
|
-
def self.build_class( klass_value )
|
9
|
-
## note: care for now only about value type / class
|
10
|
-
|
11
|
-
## note: keep a class cache
|
12
|
-
cache = @@cache ||= {}
|
13
|
-
klass = cache[ klass_value ]
|
14
|
-
return klass if klass
|
15
|
-
|
16
|
-
klass = Class.new( SafeArray )
|
17
|
-
klass.class_eval( <<RUBY )
|
18
|
-
def self.klass_value
|
19
|
-
@klass_value ||= #{klass_value}
|
20
|
-
end
|
21
|
-
RUBY
|
22
|
-
## add to cache for later (re)use
|
23
|
-
cache[ klass_value ] = klass
|
24
|
-
klass
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
def self.new_zero() new; end
|
29
|
-
def self.zero() @zero ||= new_zero; end
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def initialize
|
34
|
-
## todo/check: if array works if value is a (nested/multi-dimensional) array
|
35
|
-
@ary = []
|
36
|
-
end
|
37
|
-
|
38
|
-
def []=(index, value)
|
39
|
-
@ary[index] = value
|
40
|
-
end
|
41
|
-
|
42
|
-
def [](index)
|
43
|
-
item = @ary[ index ]
|
44
|
-
if item.nil?
|
45
|
-
## todo/check:
|
46
|
-
## always return (deep) frozen zero object - why? why not?
|
47
|
-
## let user change the returned zero object - why? why not?
|
48
|
-
if self.class.klass_value.respond_to?( :new_zero )
|
49
|
-
## note: use a new unfrozen copy of the zero object
|
50
|
-
## changes to the object MUST be possible (new "empty" modifable object expected)
|
51
|
-
item = self.class.klass_value.new_zero
|
52
|
-
else # assume value semantics e.g. Integer, Bool, etc. zero values gets replaced
|
53
|
-
## puts "use value semantics"
|
54
|
-
item = self.class.klass_value.zero
|
55
|
-
end
|
56
|
-
end
|
57
|
-
item
|
58
|
-
end
|
59
|
-
|
60
|
-
def push( item )
|
61
|
-
## todo/fix: check if item.is_a? @type
|
62
|
-
## note: Address might be a String too (Address | String)
|
63
|
-
## store Address always as String!!! - why? why not?
|
64
|
-
@ary.push( item )
|
65
|
-
end
|
66
|
-
|
67
|
-
def size() @ary.size; end
|
68
|
-
def length() size; end
|
69
|
-
end # class SafeArray
|
data/lib/universum/safe_hash.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
class SafeHash
|
5
|
-
|
6
|
-
## e.g.
|
7
|
-
## Mapping.of( Address => Money )
|
8
|
-
|
9
|
-
## note: need to create new class!! for every mapping
|
10
|
-
## make klass_key class and
|
11
|
-
## klass_value class into class instance variables
|
12
|
-
## that can get used by zero
|
13
|
-
## self.new returns a Hash.new/SafeHash.new like object
|
14
|
-
|
15
|
-
def self.build_class( klass_key, klass_value )
|
16
|
-
## note: care for now only about value type / class
|
17
|
-
|
18
|
-
## note: keep a class cache
|
19
|
-
cache = @@cache ||= {}
|
20
|
-
klass = cache[ klass_value ]
|
21
|
-
return klass if klass
|
22
|
-
|
23
|
-
klass = Class.new( SafeHash )
|
24
|
-
klass.class_eval( <<RUBY )
|
25
|
-
def self.klass_key
|
26
|
-
@klass_key ||= #{klass_key}
|
27
|
-
end
|
28
|
-
def self.klass_value
|
29
|
-
@klass_value ||= #{klass_value}
|
30
|
-
end
|
31
|
-
RUBY
|
32
|
-
## add to cache for later (re)use
|
33
|
-
cache[ klass_value ] = klass
|
34
|
-
klass
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
def self.new_zero() new; end
|
39
|
-
def self.zero() @zero ||= new_zero; end
|
40
|
-
|
41
|
-
|
42
|
-
def initialize
|
43
|
-
## todo/check: if hash works if value is a (nested) hash
|
44
|
-
@h = {}
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
def []=(key, value)
|
49
|
-
@h[key] = value
|
50
|
-
end
|
51
|
-
|
52
|
-
def [](key)
|
53
|
-
item = @h[ key ]
|
54
|
-
if item.nil?
|
55
|
-
## pp self.class.klass_value
|
56
|
-
## pp self.class.klass_value.zero
|
57
|
-
|
58
|
-
#####
|
59
|
-
# todo/check:
|
60
|
-
# add zero to hash on lookup (increases size/length)
|
61
|
-
# why? why not?
|
62
|
-
|
63
|
-
if self.class.klass_value.respond_to?( :new_zero )
|
64
|
-
## note: use a dup(licated) unfrozen copy of the zero object
|
65
|
-
## changes to the object MUST be possible (new "empty" modifable object expected)
|
66
|
-
item = @h[ key ] = self.class.klass_value.new_zero
|
67
|
-
else # assume value semantics e.g. Integer, Bool, etc. zero values gets replaced
|
68
|
-
## puts "use value semantics"
|
69
|
-
item = @h[ key ] = self.class.klass_value.zero
|
70
|
-
end
|
71
|
-
end
|
72
|
-
item
|
73
|
-
end
|
74
|
-
|
75
|
-
def size() @h.size; end
|
76
|
-
def length() size; end
|
77
|
-
end # class SafeHash
|
data/test/test_array.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
###
|
4
|
-
# to run use
|
5
|
-
# ruby -I ./lib -I ./test test/test_array.rb
|
6
|
-
|
7
|
-
|
8
|
-
require 'helper'
|
9
|
-
|
10
|
-
|
11
|
-
class TestArray < MiniTest::Test
|
12
|
-
|
13
|
-
Array_Integer = SafeArray.build_class( Integer )
|
14
|
-
Array_Bool = SafeArray.build_class( Bool )
|
15
|
-
|
16
|
-
def test_integer
|
17
|
-
pp Array_Integer
|
18
|
-
pp ary = Array_Integer.new
|
19
|
-
|
20
|
-
assert_equal Integer, Array_Integer.klass_value
|
21
|
-
assert_equal 0, ary[0]
|
22
|
-
assert_equal 0, ary[1]
|
23
|
-
|
24
|
-
ary[0] = 101
|
25
|
-
ary[1] = 102
|
26
|
-
assert_equal 101, ary[0]
|
27
|
-
assert_equal 102, ary[1]
|
28
|
-
|
29
|
-
## check Array.of (uses cached classes)
|
30
|
-
assert_equal Array_Integer, Array.of( Integer ).class
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def test_bool
|
35
|
-
pp Array_Bool
|
36
|
-
pp ary = Array_Bool.new
|
37
|
-
|
38
|
-
assert_equal Bool, Array_Bool.klass_value
|
39
|
-
assert_equal false, ary[0]
|
40
|
-
assert_equal false, ary[1]
|
41
|
-
|
42
|
-
ary[0] = true
|
43
|
-
ary[1] = true
|
44
|
-
assert_equal true, ary[0]
|
45
|
-
assert_equal true, ary[1]
|
46
|
-
|
47
|
-
## check Array.of (uses cached classes)
|
48
|
-
assert_equal Array_Bool, Array.of( Bool ).class
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
end # class TestArray
|
data/test/test_hash.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
###
|
4
|
-
# to run use
|
5
|
-
# ruby -I ./lib -I ./test test/test_hash.rb
|
6
|
-
|
7
|
-
|
8
|
-
require 'helper'
|
9
|
-
|
10
|
-
|
11
|
-
class TestHash < MiniTest::Test
|
12
|
-
|
13
|
-
## sig: [Integer, Bool, Integer, Address]
|
14
|
-
Voter = Struct.new( :weight, :voted, :vote, :delegate ) do
|
15
|
-
def self.new_zero
|
16
|
-
new( 0, false, 0, '0x0000' )
|
17
|
-
end
|
18
|
-
def self.zero
|
19
|
-
@zero ||= new_zero
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
Hash_X_Integer = SafeHash.build_class( String, Integer )
|
24
|
-
Hash_X_Bool = SafeHash.build_class( String, Bool )
|
25
|
-
Hash_X_Voter = SafeHash.build_class( String, Voter )
|
26
|
-
|
27
|
-
def test_integer
|
28
|
-
pp Hash_X_Integer
|
29
|
-
pp h = Hash_X_Integer.new
|
30
|
-
|
31
|
-
assert_equal Integer, Hash_X_Integer.klass_value
|
32
|
-
assert_equal 0, h['0x1111']
|
33
|
-
assert_equal 0, h['0x2222']
|
34
|
-
|
35
|
-
h['0x1111'] = 101
|
36
|
-
h['0x2222'] = 102
|
37
|
-
assert_equal 101, h['0x1111']
|
38
|
-
assert_equal 102, h['0x2222']
|
39
|
-
|
40
|
-
## check Mapping.of (uses cached classes)
|
41
|
-
assert_equal Hash_X_Integer, Mapping.of( String => Integer ).class
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def test_bool
|
46
|
-
pp Hash_X_Bool
|
47
|
-
pp h = Hash_X_Bool.new
|
48
|
-
|
49
|
-
assert_equal Bool, Hash_X_Bool.klass_value
|
50
|
-
assert_equal false, h['0x1111']
|
51
|
-
assert_equal false, h['0x2222']
|
52
|
-
|
53
|
-
h['0x1111'] = true
|
54
|
-
h['0x2222'] = true
|
55
|
-
assert_equal true, h['0x1111']
|
56
|
-
assert_equal true, h['0x2222']
|
57
|
-
|
58
|
-
## check Mapping.of (uses cached classes)
|
59
|
-
assert_equal Hash_X_Bool, Mapping.of( String => Bool ).class
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
def test_voter
|
64
|
-
pp Hash_X_Voter
|
65
|
-
pp h = Hash_X_Voter.new
|
66
|
-
|
67
|
-
assert_equal Voter, Hash_X_Voter.klass_value
|
68
|
-
assert_equal Voter.zero, h['0x1111']
|
69
|
-
assert_equal Voter.zero, h['0x2222']
|
70
|
-
|
71
|
-
h['0x1111'].voted = true
|
72
|
-
h['0x2222'].voted = true
|
73
|
-
assert_equal true, h['0x1111'].voted
|
74
|
-
assert_equal true, h['0x2222'].voted
|
75
|
-
|
76
|
-
pp h['0x1111']
|
77
|
-
pp h['0x2222']
|
78
|
-
|
79
|
-
## check Mapping.of (uses cached classes)
|
80
|
-
assert_equal Hash_X_Voter, Mapping.of( String => Voter ).class
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
end # class TestHash
|
data/test/test_struct.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
###
|
4
|
-
# to run use
|
5
|
-
# ruby -I ./lib -I ./test test/test_struct.rb
|
6
|
-
|
7
|
-
|
8
|
-
require 'helper'
|
9
|
-
|
10
|
-
|
11
|
-
class TestStruct < MiniTest::Test
|
12
|
-
|
13
|
-
## sig: [Integer, Bool, Integer, Address]
|
14
|
-
Voter = Struct.new( :weight, :voted, :vote, :delegate ) do
|
15
|
-
def self.new_zero
|
16
|
-
new( 0, false, 0, '0x0000' )
|
17
|
-
end
|
18
|
-
def self.zero
|
19
|
-
@zero ||= new_zero
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
def test_zero
|
25
|
-
assert_equal Voter.zero, Voter.zero
|
26
|
-
|
27
|
-
zerodup = Voter.zero.dup
|
28
|
-
zerodup.delegate = '0x1111'
|
29
|
-
pp zerodup
|
30
|
-
|
31
|
-
assert_equal '0x0000', Voter.zero.delegate
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
end # class TestStruct
|