filigree 0.1.2
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 +7 -0
- data/AUTHORS +1 -0
- data/LICENSE +12 -0
- data/README.md +336 -0
- data/Rakefile +101 -0
- data/lib/filigree/abstract_class.rb +90 -0
- data/lib/filigree/application.rb +107 -0
- data/lib/filigree/array.rb +35 -0
- data/lib/filigree/boolean.rb +40 -0
- data/lib/filigree/class.rb +48 -0
- data/lib/filigree/class_methods_module.rb +40 -0
- data/lib/filigree/commands.rb +261 -0
- data/lib/filigree/configuration.rb +411 -0
- data/lib/filigree/match.rb +499 -0
- data/lib/filigree/object.rb +40 -0
- data/lib/filigree/request_file.rb +33 -0
- data/lib/filigree/string.rb +52 -0
- data/lib/filigree/types.rb +159 -0
- data/lib/filigree/version.rb +8 -0
- data/lib/filigree/visitor.rb +195 -0
- data/lib/filigree.rb +27 -0
- data/test/tc_abstract_class.rb +74 -0
- data/test/tc_application.rb +53 -0
- data/test/tc_array.rb +28 -0
- data/test/tc_boolean.rb +38 -0
- data/test/tc_class.rb +45 -0
- data/test/tc_class_methods_module.rb +71 -0
- data/test/tc_commands.rb +78 -0
- data/test/tc_configuration.rb +173 -0
- data/test/tc_match.rb +307 -0
- data/test/tc_object.rb +43 -0
- data/test/tc_string.rb +36 -0
- data/test/tc_types.rb +116 -0
- data/test/tc_visitor.rb +236 -0
- data/test/ts_filigree.rb +33 -0
- metadata +247 -0
@@ -0,0 +1,159 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/04
|
4
|
+
# Description: Extensions to help with type checking.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Standard Library
|
11
|
+
|
12
|
+
# Filigree
|
13
|
+
require 'filigree/class_methods_module'
|
14
|
+
|
15
|
+
###########
|
16
|
+
# Methods #
|
17
|
+
###########
|
18
|
+
|
19
|
+
# A method for type checking Ruby values.
|
20
|
+
#
|
21
|
+
# @param [Object] obj Object to type check.
|
22
|
+
# @param [Class] type Class the object should be an instance of.
|
23
|
+
# @param [String, nil] blame Variable name to blame for failed type checks.
|
24
|
+
# @param [Boolean] nillable Object can be nil?
|
25
|
+
# @param [Boolean] strict Strict or non-strict checking. Uses `instance_of?` and `is_a?` respectively.
|
26
|
+
#
|
27
|
+
# @raise [ArgumentError] An error is raise if the type checking fails.
|
28
|
+
#
|
29
|
+
# @return [Object] The object passed as parameter o.
|
30
|
+
def check_type(obj, type, blame = nil, nillable = false, strict = false)
|
31
|
+
type_ok = if strict then obj.instance_of?(type) else obj.is_a?(type) end || (obj.nil? and nillable)
|
32
|
+
|
33
|
+
if type_ok
|
34
|
+
obj
|
35
|
+
else
|
36
|
+
if blame
|
37
|
+
raise TypeError,
|
38
|
+
"Parameter #{blame} must be an instance of the #{type.name} class. Received an instance of #{obj.class.name}."
|
39
|
+
else
|
40
|
+
raise TypeError,
|
41
|
+
"Expected an object of type #{type.name}. Received an instance of #{obj.class.name}."
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# A method for type checking Ruby array values.
|
47
|
+
#
|
48
|
+
# @param [Array<Object>] array Array of objects to type check.
|
49
|
+
# @param [Class] type Class the objects should be an instance of.
|
50
|
+
# @param [String, nil] blame Variable name to blame for failed type checks.
|
51
|
+
# @param [Boolean] nillable Object can be nil?
|
52
|
+
# @param [Boolean] strict Strict or non-strict checking. Uses `instance_of?` and `is_a?` respectively.
|
53
|
+
#
|
54
|
+
# @raise [ArgumentError] An error is raise if the type checking fails.
|
55
|
+
#
|
56
|
+
# @return [Object] The object passed in parameter o.
|
57
|
+
def check_array_type(array, type, blame = nil, nillable = false, strict = false)
|
58
|
+
array.each do |obj|
|
59
|
+
type_ok = if strict then obj.instance_of?(type) else obj.is_a?(type) end || (obj.nil? and nillable)
|
60
|
+
|
61
|
+
if not type_ok
|
62
|
+
if blame
|
63
|
+
raise TypeError, "Parameter #{blame} must contain instances of the #{type.name} class."
|
64
|
+
else
|
65
|
+
raise TypeError, "Expected an object of type #{type.name}."
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
#######################
|
72
|
+
# Classes and Modules #
|
73
|
+
#######################
|
74
|
+
|
75
|
+
module Filigree
|
76
|
+
# Allows the including class to define typed type checked instance
|
77
|
+
# variables. This also provides a default constructor.
|
78
|
+
module TypedClass
|
79
|
+
include ClassMethodsModule
|
80
|
+
|
81
|
+
# Set each of the typed instance variables to its corresponding
|
82
|
+
# value.
|
83
|
+
#
|
84
|
+
# @param [Array<Object>] vals Values to set typed variables to
|
85
|
+
#
|
86
|
+
# @return [void]
|
87
|
+
def set_typed_ivars(vals)
|
88
|
+
self.class.typed_ivars.zip(vals).each do |name, val|
|
89
|
+
self.send("#{name}=", val)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
module ClassMethods
|
94
|
+
# Define the default constructor for the including class.
|
95
|
+
#
|
96
|
+
# @param [Boolean] strict To use strict checking or not
|
97
|
+
#
|
98
|
+
# @return [void]
|
99
|
+
def default_constructor(strict = false)
|
100
|
+
class_eval do
|
101
|
+
if strict
|
102
|
+
def initialize(*vals)
|
103
|
+
if self.class.typed_ivars.length != vals.length
|
104
|
+
raise ArgumentError, "#{self.class.typed_ivars.length} arguments expected, #{vals.length} given."
|
105
|
+
end
|
106
|
+
|
107
|
+
self.set_typed_ivars(vals)
|
108
|
+
end
|
109
|
+
else
|
110
|
+
def initialize(*vals)
|
111
|
+
self.set_typed_ivars(vals)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Define a new typed accessor.
|
118
|
+
#
|
119
|
+
# @param [Symbol] name Name of the accessor
|
120
|
+
# @param [Boolean] nillable If the value can be nil or not
|
121
|
+
# @param [Boolean] strict To use strict checking or not
|
122
|
+
# @param [Class] type Type of the accessor
|
123
|
+
# @param [Proc] checker Method used to check the type
|
124
|
+
#
|
125
|
+
# @return [void]
|
126
|
+
def define_typed_accessor(name, nillable, strict, type, checker)
|
127
|
+
define_method "#{name}=" do |obj|
|
128
|
+
self.instance_variable_set("@#{name}", checker.call(obj, type, name, nillable, strict))
|
129
|
+
end
|
130
|
+
end
|
131
|
+
private :define_typed_accessor
|
132
|
+
|
133
|
+
# Define a typed instance variable.
|
134
|
+
#
|
135
|
+
# @param [Symbol] name Name of the accessor
|
136
|
+
# @param [Class] type Type of the accessor
|
137
|
+
# @param [Boolean] nillable If the value can be nil or not
|
138
|
+
# @param [Boolean] strict To use strict checking or not
|
139
|
+
#
|
140
|
+
# @return [void]
|
141
|
+
def typed_ivar(name, type, nillable = false, strict = false)
|
142
|
+
typed_ivars << name
|
143
|
+
|
144
|
+
define_typed_accessor(name, nillable, strict, *
|
145
|
+
type.is_a?(Array) ? [type.first, method(:check_array_type)] : [type, method(:check_type)]
|
146
|
+
)
|
147
|
+
|
148
|
+
attr_reader name
|
149
|
+
end
|
150
|
+
|
151
|
+
# Return the typed instance variables for an object.
|
152
|
+
#
|
153
|
+
# @return [Array<Symbol>] Array of defined typed instance variables
|
154
|
+
def typed_ivars
|
155
|
+
@typed_ivars ||= Array.new
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2014/02/11
|
4
|
+
# Description: An implementation of the Visitor pattern.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Standard Library
|
11
|
+
|
12
|
+
# Filigree
|
13
|
+
require 'filigree/class_methods_module'
|
14
|
+
require 'filigree/match'
|
15
|
+
|
16
|
+
#######################
|
17
|
+
# Classes and Modules #
|
18
|
+
#######################
|
19
|
+
|
20
|
+
module Filigree
|
21
|
+
# An implementation of the Visitor pattern.
|
22
|
+
module Visitor
|
23
|
+
|
24
|
+
include ClassMethodsModule
|
25
|
+
|
26
|
+
####################
|
27
|
+
# Instance Methods #
|
28
|
+
####################
|
29
|
+
|
30
|
+
# Find the correct pattern and execute its block on the provided
|
31
|
+
# objects.
|
32
|
+
#
|
33
|
+
# @param [Object] objects Objects to pattern match.
|
34
|
+
#
|
35
|
+
# @return [Object] Result of calling the matched pattern's block
|
36
|
+
#
|
37
|
+
# @raise [MatchError] Raised when no matching pattern is found
|
38
|
+
def call(*objects)
|
39
|
+
self.class.patterns.each do |pattern|
|
40
|
+
@match_bindings = OpenStruct.new
|
41
|
+
|
42
|
+
return pattern.(self, objects) if pattern.match?(objects, self)
|
43
|
+
end
|
44
|
+
|
45
|
+
# If we didn't find anything we raise a MatchError.
|
46
|
+
raise MatchError
|
47
|
+
end
|
48
|
+
alias :visit :call
|
49
|
+
|
50
|
+
#############
|
51
|
+
# Callbacks #
|
52
|
+
#############
|
53
|
+
|
54
|
+
# This is used to get and set binding names
|
55
|
+
def method_missing(name, *args)
|
56
|
+
if args.empty? and @match_bindings.respond_to?(name)
|
57
|
+
@match_bindings.send(name)
|
58
|
+
elsif name.to_s[-1] == '=' and args.length == 1
|
59
|
+
@match_bindings.send(name, *args)
|
60
|
+
else
|
61
|
+
super(name, *args)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
#################
|
66
|
+
# Class Methods #
|
67
|
+
#################
|
68
|
+
|
69
|
+
module ClassMethods
|
70
|
+
|
71
|
+
attr_reader :patterns
|
72
|
+
|
73
|
+
# Force a name binding.
|
74
|
+
#
|
75
|
+
# @param [Symbol] name Name to bind to
|
76
|
+
#
|
77
|
+
# @return [BindingPattern]
|
78
|
+
def Bind(name)
|
79
|
+
BindingPattern.new(name)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Force a literal comparison.
|
83
|
+
#
|
84
|
+
# @param [Object] obj Object to be comapred against
|
85
|
+
#
|
86
|
+
# @return [LiteralPattern]
|
87
|
+
def Literal(obj)
|
88
|
+
LiteralPattern.new(obj)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Install the instance class variables in the including class.
|
92
|
+
#
|
93
|
+
# @return [void]
|
94
|
+
def install_icvars
|
95
|
+
@patterns = Array.new
|
96
|
+
@deferred = Array.new
|
97
|
+
end
|
98
|
+
|
99
|
+
# Define a pattern for this visitor.
|
100
|
+
#
|
101
|
+
# @see match Pattern matching description
|
102
|
+
#
|
103
|
+
# @param [Object] pattern List of pattern elements
|
104
|
+
# @param [Proc] block Block to be executed when the pattern is matched
|
105
|
+
#
|
106
|
+
# @return [void]
|
107
|
+
def on(*pattern, &block)
|
108
|
+
guard = if pattern.last.is_a?(Proc) then pattern.pop end
|
109
|
+
|
110
|
+
@patterns << (mp = OuterPattern.new(pattern, guard, block))
|
111
|
+
|
112
|
+
if block
|
113
|
+
@deferred.each { |pattern| pattern.block = block }
|
114
|
+
@deferred.clear
|
115
|
+
|
116
|
+
else
|
117
|
+
@deferred << mp
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
#############
|
122
|
+
# Callbacks #
|
123
|
+
#############
|
124
|
+
|
125
|
+
# Used to generate wildcard and binding patterns.
|
126
|
+
def method_missing(name, *args)
|
127
|
+
if args.empty?
|
128
|
+
if name == :_ then WildcardPattern.instance else BindingPattern.new(name) end
|
129
|
+
else
|
130
|
+
super(name, *args)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.extended(klass)
|
135
|
+
klass.install_icvars
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# This class can be used to call multiple visitors on an object at once.
|
141
|
+
# This could potentialy reduce the number of times data structures are
|
142
|
+
# traversed.
|
143
|
+
class TourGuide
|
144
|
+
attr_reader :visitors
|
145
|
+
|
146
|
+
# Call each visitor on the specified objects.
|
147
|
+
#
|
148
|
+
# @param [Object] objects Objects to be visited
|
149
|
+
#
|
150
|
+
# @return [Array<Visitor>] The wrapped visitors
|
151
|
+
def call(*objects)
|
152
|
+
@visitors.each { |visitor| visitor.(*objects) }
|
153
|
+
end
|
154
|
+
|
155
|
+
# Construct a tour guide for a list of visitors.
|
156
|
+
#
|
157
|
+
# @param [Visitor] visitors List of visitors
|
158
|
+
def initialize(*visitors)
|
159
|
+
@visitors = visitors
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# This module provides a default implementation of three common traversal
|
164
|
+
# patterns: pre-order, post-order, and in-order (level-order). The
|
165
|
+
# including class must implement the `children` function.
|
166
|
+
module Visitable
|
167
|
+
|
168
|
+
# Visit this object with the provided visitor in pre-, post-, or
|
169
|
+
# in-order traversal.
|
170
|
+
#
|
171
|
+
# @param [Visitor] visitor Visitor to call
|
172
|
+
# @param [:preorder, :inorder, :postorder] method How to visit
|
173
|
+
#
|
174
|
+
# @return [void]
|
175
|
+
def visit(visitor, method = :preorder)
|
176
|
+
case method
|
177
|
+
when :preorder
|
178
|
+
visitor.(self)
|
179
|
+
children.compact.each { |child| child.visit(visitor, :preorder) }
|
180
|
+
|
181
|
+
when :inorder
|
182
|
+
nodes = [self]
|
183
|
+
|
184
|
+
while node = nodes.shift
|
185
|
+
nodes += node.children.compact
|
186
|
+
visitor.(node)
|
187
|
+
end
|
188
|
+
|
189
|
+
when :postorder
|
190
|
+
children.compact.each { |child| child.visit(visitor, :postorder) }
|
191
|
+
visitor.(self)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
data/lib/filigree.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/4/19
|
4
|
+
# Description: The root file for the Filigree project.
|
5
|
+
|
6
|
+
#############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Standard Library
|
11
|
+
|
12
|
+
# Filigree
|
13
|
+
require 'filigree/abstract_class'
|
14
|
+
require 'filigree/application'
|
15
|
+
require 'filigree/array'
|
16
|
+
require 'filigree/boolean'
|
17
|
+
require 'filigree/class'
|
18
|
+
require 'filigree/class_methods_module'
|
19
|
+
require 'filigree/commands'
|
20
|
+
require 'filigree/configuration'
|
21
|
+
require 'filigree/match'
|
22
|
+
require 'filigree/object'
|
23
|
+
require 'filigree/request_file'
|
24
|
+
require 'filigree/string'
|
25
|
+
require 'filigree/types'
|
26
|
+
require 'filigree/version'
|
27
|
+
require 'filigree/visitor'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/04/19
|
4
|
+
# Description: Test cases for the AbstractClass module.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Gems
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
# Filigree
|
14
|
+
require 'filigree/abstract_class'
|
15
|
+
|
16
|
+
#######################
|
17
|
+
# Classes and Modules #
|
18
|
+
#######################
|
19
|
+
|
20
|
+
class AbstractClassTester < Minitest::Test
|
21
|
+
class Foo
|
22
|
+
extend Filigree::AbstractClass
|
23
|
+
|
24
|
+
abstract_method :foo
|
25
|
+
end
|
26
|
+
|
27
|
+
class Bar < Foo; end
|
28
|
+
|
29
|
+
class Bam < Foo
|
30
|
+
def foo
|
31
|
+
true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Baf < Foo
|
36
|
+
extend Filigree::AbstractClass
|
37
|
+
end
|
38
|
+
|
39
|
+
class Zap < Baf; end
|
40
|
+
|
41
|
+
def setup
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_abstract_method
|
45
|
+
assert_raises(AbstractMethodError) { Bar.new.foo }
|
46
|
+
|
47
|
+
Bam.new.foo
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_instantiate_abstract_class
|
51
|
+
assert_raises(AbstractClassError) { Foo.new }
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_instantiate_subclass
|
55
|
+
Bar.new
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_multi_level_abstract_hierarchy
|
59
|
+
assert_raises(AbstractClassError) { Baf.new }
|
60
|
+
|
61
|
+
Zap.new
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_multiple_hierarchies
|
65
|
+
baf = Class.new { extend Filigree::AbstractClass }
|
66
|
+
baz = Class.new(baf)
|
67
|
+
|
68
|
+
assert_raises(AbstractClassError) { Foo.new }
|
69
|
+
assert_raises(AbstractClassError) { baf.new }
|
70
|
+
|
71
|
+
Bar.new
|
72
|
+
baz.new
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/15
|
4
|
+
# Description: Test cases for the Application module.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Gems
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
# Filigree
|
14
|
+
require 'filigree/application'
|
15
|
+
|
16
|
+
#######################
|
17
|
+
# Classes and Modules #
|
18
|
+
#######################
|
19
|
+
|
20
|
+
class ApplicationTester < Minitest::Test
|
21
|
+
class Foo
|
22
|
+
include Filigree::Application
|
23
|
+
end
|
24
|
+
|
25
|
+
class Bar
|
26
|
+
include Filigree::Application
|
27
|
+
|
28
|
+
class Configuration
|
29
|
+
auto :foo do
|
30
|
+
:foo
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def kill; end
|
35
|
+
def pause; end
|
36
|
+
def resume; end
|
37
|
+
def run; end
|
38
|
+
def stop; end
|
39
|
+
end
|
40
|
+
|
41
|
+
def setup
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_application
|
46
|
+
assert_raises(NoMethodError) { Foo.finalize }
|
47
|
+
Bar.finalize
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_embedded_config
|
51
|
+
assert_equal :foo, Bar.new.config.foo
|
52
|
+
end
|
53
|
+
end
|
data/test/tc_array.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2014/02/05
|
4
|
+
# Description: Test cases for the Array extensions.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Gems
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
# Filigree
|
14
|
+
require 'filigree/array'
|
15
|
+
|
16
|
+
#######################
|
17
|
+
# Classes and Modules #
|
18
|
+
#######################
|
19
|
+
|
20
|
+
class ArrayTester < Minitest::Test
|
21
|
+
|
22
|
+
def setup
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_map_with_method
|
26
|
+
assert_equal [:cat, :dog, :cow], ['cat', 'dog', 'cow'].map(:to_sym)
|
27
|
+
end
|
28
|
+
end
|
data/test/tc_boolean.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/04
|
4
|
+
# Description: Test cases for Boolean extensions.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Gems
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
# Filigree
|
14
|
+
require 'filigree/boolean'
|
15
|
+
|
16
|
+
#######################
|
17
|
+
# Classes and Modules #
|
18
|
+
#######################
|
19
|
+
|
20
|
+
class BooleanTester < Minitest::Test
|
21
|
+
def setup
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_integer
|
26
|
+
assert 1.to_bool
|
27
|
+
assert 10.to_bool
|
28
|
+
assert !0.to_bool
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_true
|
32
|
+
assert_equal 1, true.to_i
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_false
|
36
|
+
assert_equal 0, false.to_i
|
37
|
+
end
|
38
|
+
end
|
data/test/tc_class.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/04
|
4
|
+
# Description: Test cases for Class extensions.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Gems
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
# Filigree
|
14
|
+
require 'filigree/class'
|
15
|
+
|
16
|
+
#######################
|
17
|
+
# Classes and Modules #
|
18
|
+
#######################
|
19
|
+
|
20
|
+
class ClassTester < Minitest::Test
|
21
|
+
module Foo; end
|
22
|
+
|
23
|
+
class Bar
|
24
|
+
include Foo
|
25
|
+
|
26
|
+
class Baf; end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Baz < Bar; end
|
30
|
+
|
31
|
+
def setup
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_class
|
36
|
+
assert Bar.includes_module?(Foo)
|
37
|
+
|
38
|
+
assert_equal 'ClassTester::Bar::Baf', Bar::Baf.name
|
39
|
+
assert_equal 'Baf', Bar::Baf.short_name
|
40
|
+
|
41
|
+
assert Baz.subclass_of?(Bar)
|
42
|
+
assert !Baz.subclass_of?(Fixnum)
|
43
|
+
assert_raises(TypeError) { Baz.subclass_of?(1) }
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Author: Chris Wailes <chris.wailes@gmail.com>
|
2
|
+
# Project: Filigree
|
3
|
+
# Date: 2013/05/15
|
4
|
+
# Description: Test cases the InnerClassModule module.
|
5
|
+
|
6
|
+
############
|
7
|
+
# Requires #
|
8
|
+
############
|
9
|
+
|
10
|
+
# Gems
|
11
|
+
require 'minitest/autorun'
|
12
|
+
|
13
|
+
# Filigree
|
14
|
+
require 'filigree/class_methods_module'
|
15
|
+
|
16
|
+
#######################
|
17
|
+
# Classes and Modules #
|
18
|
+
#######################
|
19
|
+
|
20
|
+
class ClassMethodsModuleTester < Minitest::Test
|
21
|
+
module Foo
|
22
|
+
include Filigree::ClassMethodsModule
|
23
|
+
|
24
|
+
def foo
|
25
|
+
:foo
|
26
|
+
end
|
27
|
+
|
28
|
+
module ClassMethods
|
29
|
+
def foo
|
30
|
+
:foo
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module Baz
|
36
|
+
include Filigree::ClassMethodsModule
|
37
|
+
|
38
|
+
def baz
|
39
|
+
:baz
|
40
|
+
end
|
41
|
+
|
42
|
+
module ClassMethods
|
43
|
+
def baz
|
44
|
+
:baz
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class Bar
|
50
|
+
include Foo
|
51
|
+
end
|
52
|
+
|
53
|
+
class Baf
|
54
|
+
include Foo
|
55
|
+
include Baz
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_class_methods_module
|
59
|
+
assert_equal :foo, Bar.foo
|
60
|
+
assert_equal :foo, Bar.new.foo
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_double_include
|
64
|
+
|
65
|
+
assert_equal :foo, Baf.foo
|
66
|
+
assert_equal :foo, Baf.new.foo
|
67
|
+
|
68
|
+
assert_equal :baz, Baf.baz
|
69
|
+
assert_equal :baz, Baf.new.baz
|
70
|
+
end
|
71
|
+
end
|