motion-support 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +1 -1
- data/README.md +231 -2
- data/Rakefile +3 -3
- data/app/app_delegate.rb +0 -2
- data/examples/Inflector/.gitignore +16 -0
- data/examples/Inflector/Gemfile +5 -0
- data/examples/Inflector/Rakefile +13 -0
- data/examples/Inflector/app/app_delegate.rb +8 -0
- data/examples/Inflector/app/inflections.rb +5 -0
- data/examples/Inflector/app/inflector_view_controller.rb +120 -0
- data/examples/Inflector/app/words_view_controller.rb +101 -0
- data/examples/Inflector/resources/Default-568h@2x.png +0 -0
- data/examples/Inflector/spec/main_spec.rb +9 -0
- data/lib/motion-support/core_ext/array.rb +13 -0
- data/lib/motion-support/core_ext/class.rb +8 -0
- data/lib/motion-support/core_ext/hash.rb +16 -0
- data/lib/motion-support/core_ext/integer.rb +9 -0
- data/lib/motion-support/core_ext/module.rb +14 -0
- data/lib/motion-support/core_ext/numeric.rb +8 -0
- data/lib/motion-support/core_ext/object.rb +14 -0
- data/lib/motion-support/core_ext/range.rb +8 -0
- data/lib/motion-support/core_ext/string.rb +14 -0
- data/lib/motion-support/core_ext/time.rb +19 -0
- data/lib/motion-support/core_ext.rb +3 -0
- data/lib/motion-support/inflector.rb +12 -156
- data/lib/motion-support.rb +5 -5
- data/motion/_stdlib/cgi.rb +22 -0
- data/motion/_stdlib/date.rb +77 -0
- data/motion/_stdlib/time.rb +19 -0
- data/motion/core_ext/array/access.rb +28 -0
- data/motion/core_ext/array/conversions.rb +86 -0
- data/motion/core_ext/array/extract_options.rb +11 -0
- data/motion/core_ext/array/grouping.rb +99 -0
- data/motion/core_ext/array/prepend_and_append.rb +7 -0
- data/motion/core_ext/array/wrap.rb +45 -0
- data/{lib/motion-support → motion/core_ext}/array.rb +0 -4
- data/motion/core_ext/class/attribute.rb +119 -0
- data/motion/core_ext/class/attribute_accessors.rb +168 -0
- data/motion/core_ext/date/acts_like.rb +8 -0
- data/motion/core_ext/date/calculations.rb +117 -0
- data/motion/core_ext/date/conversions.rb +56 -0
- data/motion/core_ext/date_and_time/calculations.rb +232 -0
- data/motion/core_ext/enumerable.rb +90 -0
- data/motion/core_ext/hash/deep_merge.rb +27 -0
- data/motion/core_ext/hash/except.rb +15 -0
- data/motion/core_ext/hash/indifferent_access.rb +19 -0
- data/motion/core_ext/hash/keys.rb +138 -0
- data/motion/core_ext/hash/reverse_merge.rb +22 -0
- data/motion/core_ext/hash/slice.rb +40 -0
- data/motion/core_ext/integer/inflections.rb +27 -0
- data/motion/core_ext/integer/multiple.rb +10 -0
- data/motion/core_ext/integer/time.rb +41 -0
- data/{lib/motion-support → motion/core_ext}/metaclass.rb +0 -0
- data/motion/core_ext/module/aliasing.rb +69 -0
- data/motion/core_ext/module/anonymous.rb +19 -0
- data/motion/core_ext/module/attr_internal.rb +38 -0
- data/motion/core_ext/module/attribute_accessors.rb +64 -0
- data/motion/core_ext/module/delegation.rb +175 -0
- data/motion/core_ext/module/introspection.rb +60 -0
- data/motion/core_ext/module/reachable.rb +5 -0
- data/motion/core_ext/module/remove_method.rb +12 -0
- data/motion/core_ext/ns_dictionary.rb +11 -0
- data/motion/core_ext/numeric/bytes.rb +44 -0
- data/motion/core_ext/numeric/conversions.rb +7 -0
- data/motion/core_ext/numeric/time.rb +75 -0
- data/motion/core_ext/object/acts_like.rb +10 -0
- data/motion/core_ext/object/blank.rb +105 -0
- data/motion/core_ext/object/deep_dup.rb +44 -0
- data/motion/core_ext/object/duplicable.rb +83 -0
- data/motion/core_ext/object/instance_variables.rb +28 -0
- data/motion/core_ext/object/to_param.rb +58 -0
- data/motion/core_ext/object/to_query.rb +26 -0
- data/motion/core_ext/object/try.rb +78 -0
- data/motion/core_ext/range/include_range.rb +23 -0
- data/motion/core_ext/range/overlaps.rb +8 -0
- data/motion/core_ext/regexp.rb +5 -0
- data/motion/core_ext/string/access.rb +104 -0
- data/motion/core_ext/string/behavior.rb +6 -0
- data/motion/core_ext/string/exclude.rb +11 -0
- data/motion/core_ext/string/filters.rb +55 -0
- data/motion/core_ext/string/indent.rb +43 -0
- data/motion/core_ext/string/inflections.rb +195 -0
- data/motion/core_ext/string/starts_ends_with.rb +4 -0
- data/motion/core_ext/string/strip.rb +24 -0
- data/motion/core_ext/time/acts_like.rb +8 -0
- data/motion/core_ext/time/calculations.rb +215 -0
- data/motion/core_ext/time/conversions.rb +52 -0
- data/motion/duration.rb +104 -0
- data/motion/hash_with_indifferent_access.rb +251 -0
- data/motion/inflections.rb +67 -0
- data/motion/inflector/inflections.rb +203 -0
- data/motion/inflector/methods.rb +321 -0
- data/{lib/motion-support → motion}/logger.rb +0 -0
- data/{lib/motion-support → motion}/version.rb +1 -1
- data/motion-support.gemspec +2 -2
- data/spec/motion-support/_helpers/constantize_test_cases.rb +75 -0
- data/spec/motion-support/_helpers/inflector_test_cases.rb +313 -0
- data/spec/motion-support/core_ext/array/access_spec.rb +29 -0
- data/spec/motion-support/core_ext/array/conversion_spec.rb +60 -0
- data/spec/motion-support/core_ext/array/extract_options_spec.rb +15 -0
- data/spec/motion-support/core_ext/array/grouping_spec.rb +85 -0
- data/spec/motion-support/core_ext/array/prepend_and_append_spec.rb +25 -0
- data/spec/motion-support/core_ext/array/wrap_spec.rb +19 -0
- data/spec/motion-support/{array_spec.rb → core_ext/array_spec.rb} +0 -5
- data/spec/motion-support/core_ext/class/attribute_accessor_spec.rb +127 -0
- data/spec/motion-support/core_ext/class/attribute_spec.rb +92 -0
- data/spec/motion-support/core_ext/date/acts_like_spec.rb +11 -0
- data/spec/motion-support/core_ext/date/calculation_spec.rb +186 -0
- data/spec/motion-support/core_ext/date/conversion_spec.rb +18 -0
- data/spec/motion-support/core_ext/date_and_time/calculation_spec.rb +336 -0
- data/spec/motion-support/core_ext/enumerable_spec.rb +130 -0
- data/spec/motion-support/core_ext/hash/deep_merge_spec.rb +32 -0
- data/spec/motion-support/core_ext/hash/except_spec.rb +43 -0
- data/spec/motion-support/core_ext/hash/key_spec.rb +230 -0
- data/spec/motion-support/core_ext/hash/reverse_merge_spec.rb +26 -0
- data/spec/motion-support/core_ext/hash/slice_spec.rb +61 -0
- data/spec/motion-support/core_ext/integer/inflection_spec.rb +23 -0
- data/spec/motion-support/core_ext/integer/multiple_spec.rb +19 -0
- data/spec/motion-support/{metaclass_spec.rb → core_ext/metaclass_spec.rb} +0 -0
- data/spec/motion-support/core_ext/module/aliasing_spec.rb +143 -0
- data/spec/motion-support/core_ext/module/anonymous_spec.rb +29 -0
- data/spec/motion-support/core_ext/module/attr_internal_spec.rb +104 -0
- data/spec/motion-support/core_ext/module/attribute_accessor_spec.rb +86 -0
- data/spec/motion-support/core_ext/module/delegation_spec.rb +136 -0
- data/spec/motion-support/core_ext/module/introspection_spec.rb +70 -0
- data/spec/motion-support/core_ext/module/reachable_spec.rb +61 -0
- data/spec/motion-support/core_ext/module/remove_method_spec.rb +25 -0
- data/spec/motion-support/core_ext/numeric/bytes_spec.rb +43 -0
- data/spec/motion-support/core_ext/object/acts_like_spec.rb +21 -0
- data/spec/motion-support/core_ext/object/blank_spec.rb +54 -0
- data/spec/motion-support/core_ext/object/deep_dup_spec.rb +54 -0
- data/spec/motion-support/core_ext/object/duplicable_spec.rb +31 -0
- data/spec/motion-support/core_ext/object/instance_variable_spec.rb +19 -0
- data/spec/motion-support/core_ext/object/to_param_spec.rb +75 -0
- data/spec/motion-support/core_ext/object/to_query_spec.rb +37 -0
- data/spec/motion-support/core_ext/object/try_spec.rb +92 -0
- data/spec/motion-support/core_ext/range/include_range_spec.rb +31 -0
- data/spec/motion-support/core_ext/range/overlap_spec.rb +43 -0
- data/spec/motion-support/core_ext/regexp_spec.rb +7 -0
- data/spec/motion-support/core_ext/string/access_spec.rb +53 -0
- data/spec/motion-support/core_ext/string/behavior_spec.rb +7 -0
- data/spec/motion-support/core_ext/string/exclude_spec.rb +8 -0
- data/spec/motion-support/core_ext/string/filter_spec.rb +48 -0
- data/spec/motion-support/core_ext/string/indent_spec.rb +56 -0
- data/spec/motion-support/core_ext/string/inflection_spec.rb +142 -0
- data/spec/motion-support/core_ext/string/starts_end_with_spec.rb +14 -0
- data/spec/motion-support/core_ext/string/strip_spec.rb +34 -0
- data/spec/motion-support/core_ext/string_spec.rb +88 -0
- data/spec/motion-support/core_ext/time/acts_like_spec.rb +11 -0
- data/spec/motion-support/core_ext/time/calculation_spec.rb +201 -0
- data/spec/motion-support/core_ext/time/conversion_spec.rb +54 -0
- data/spec/motion-support/duration_spec.rb +107 -0
- data/spec/motion-support/hash_with_indifferent_access_spec.rb +605 -0
- data/spec/motion-support/inflector_spec.rb +474 -35
- data/spec/motion-support/ns_dictionary_spec.rb +29 -0
- metadata +212 -35
- data/lib/motion-support/cattr_accessor.rb +0 -19
- data/lib/motion-support/class_inheritable_accessor.rb +0 -23
- data/lib/motion-support/class_inheritable_array.rb +0 -29
- data/lib/motion-support/hash.rb +0 -31
- data/lib/motion-support/nilclass.rb +0 -5
- data/lib/motion-support/object.rb +0 -17
- data/lib/motion-support/string.rb +0 -71
- data/spec/motion-support/cattr_accessor_spec.rb +0 -49
- data/spec/motion-support/class_inheritable_accessor_spec.rb +0 -49
- data/spec/motion-support/class_inheritable_array_spec.rb +0 -61
- data/spec/motion-support/hash_spec.rb +0 -31
- data/spec/motion-support/nilclass_spec.rb +0 -5
- data/spec/motion-support/object_spec.rb +0 -43
- data/spec/motion-support/string_spec.rb +0 -145
@@ -0,0 +1,142 @@
|
|
1
|
+
describe "String" do
|
2
|
+
describe "Inflections" do
|
3
|
+
describe "singularize" do
|
4
|
+
InflectorTestCases::SingularToPlural.each do |singular, plural|
|
5
|
+
it "should pluralize singular #{singular}" do
|
6
|
+
singular.pluralize.should == plural
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should pluralize plural" do
|
11
|
+
"plurals".pluralize.should == "plurals"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should pluralize with number" do
|
15
|
+
"blargle".pluralize(0).should == "blargles"
|
16
|
+
"blargle".pluralize(1).should == "blargle"
|
17
|
+
"blargle".pluralize(2).should == "blargles"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "singularize" do
|
22
|
+
InflectorTestCases::SingularToPlural.each do |singular, plural|
|
23
|
+
it "should singularize plural #{plural}" do
|
24
|
+
plural.singularize.should == singular
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "titleize" do
|
30
|
+
InflectorTestCases::MixtureToTitleCase.each do |before, titleized|
|
31
|
+
it "should titleize #{before}" do
|
32
|
+
before.titleize.should == titleized
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "camelize" do
|
38
|
+
InflectorTestCases::CamelToUnderscore.each do |camel, underscore|
|
39
|
+
it "should camelize #{underscore}" do
|
40
|
+
underscore.camelize.should == camel
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should lower-camelize" do
|
45
|
+
'Capital'.camelize(:lower).should == 'capital'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "dasherize" do
|
50
|
+
InflectorTestCases::UnderscoresToDashes.each do |underscored, dasherized|
|
51
|
+
it "should dasherize #{underscored}" do
|
52
|
+
underscored.dasherize.should == dasherized
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "underscore" do
|
58
|
+
InflectorTestCases::CamelToUnderscore.each do |camel, underscore|
|
59
|
+
it "should underscore #{camel}" do
|
60
|
+
camel.underscore.should == underscore
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should underscore acronyms" do
|
65
|
+
"HTMLTidy".underscore.should == "html_tidy"
|
66
|
+
"HTMLTidyGenerator".underscore.should == "html_tidy_generator"
|
67
|
+
end
|
68
|
+
|
69
|
+
InflectorTestCases::UnderscoreToLowerCamel.each do |underscored, lower_camel|
|
70
|
+
it "should lower-camelize #{underscored}" do
|
71
|
+
underscored.camelize(:lower).should == lower_camel
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should demodulize" do
|
77
|
+
"MyApplication::Billing::Account".demodulize.should == "Account"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should deconstantize" do
|
81
|
+
"MyApplication::Billing::Account".deconstantize.should == "MyApplication::Billing"
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "foreign_key" do
|
85
|
+
InflectorTestCases::ClassNameToForeignKeyWithUnderscore.each do |klass, foreign_key|
|
86
|
+
it "should build foreign key from #{klass}" do
|
87
|
+
klass.foreign_key.should == foreign_key
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
InflectorTestCases::ClassNameToForeignKeyWithoutUnderscore.each do |klass, foreign_key|
|
92
|
+
it "should build foreign key from #{klass} without underscore" do
|
93
|
+
klass.foreign_key(false).should == foreign_key
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "tableize" do
|
99
|
+
InflectorTestCases::ClassNameToTableName.each do |class_name, table_name|
|
100
|
+
it "should tableize #{class_name}" do
|
101
|
+
class_name.tableize.should == table_name
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "classify" do
|
107
|
+
InflectorTestCases::ClassNameToTableName.each do |class_name, table_name|
|
108
|
+
it "should classify #{table_name}" do
|
109
|
+
table_name.classify.should == class_name
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "humanize" do
|
115
|
+
InflectorTestCases::UnderscoreToHuman.each do |underscore, human|
|
116
|
+
it "should humanize #{underscore}" do
|
117
|
+
underscore.humanize.should == human
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "constantize" do
|
123
|
+
extend ConstantizeTestCases
|
124
|
+
|
125
|
+
it "should constantize" do
|
126
|
+
run_constantize_tests_on do |string|
|
127
|
+
string.constantize
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "safe_constantize" do
|
133
|
+
extend ConstantizeTestCases
|
134
|
+
|
135
|
+
it "should safe_constantize" do
|
136
|
+
run_safe_constantize_tests_on do |string|
|
137
|
+
string.safe_constantize
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
describe "String" do
|
2
|
+
describe "starts_with?/ends_with?" do
|
3
|
+
it "should have starts/ends_with? alias" do
|
4
|
+
s = "hello"
|
5
|
+
s.starts_with?('h').should.be.true
|
6
|
+
s.starts_with?('hel').should.be.true
|
7
|
+
s.starts_with?('el').should.be.false
|
8
|
+
|
9
|
+
s.ends_with?('o').should.be.true
|
10
|
+
s.ends_with?('lo').should.be.true
|
11
|
+
s.ends_with?('el').should.be.false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
describe "String" do
|
2
|
+
describe "strip_heredoc" do
|
3
|
+
it "should strip heredoc on an empty string" do
|
4
|
+
''.strip_heredoc.should == ''
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should strip heredoc on a string with no lines" do
|
8
|
+
'x'.strip_heredoc.should == 'x'
|
9
|
+
' x'.strip_heredoc.should == 'x'
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should strip heredoc on a heredoc with no margin" do
|
13
|
+
"foo\nbar".strip_heredoc.should == "foo\nbar"
|
14
|
+
"foo\n bar".strip_heredoc.should == "foo\n bar"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should strip heredoc on a regular indented heredoc" do
|
18
|
+
<<-EOS.strip_heredoc.should == "foo\n bar\nbaz\n"
|
19
|
+
foo
|
20
|
+
bar
|
21
|
+
baz
|
22
|
+
EOS
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should strip heredoc on a regular indented heredoc with blank lines" do
|
26
|
+
<<-EOS.strip_heredoc.should == "foo\n bar\n\nbaz\n"
|
27
|
+
foo
|
28
|
+
bar
|
29
|
+
|
30
|
+
baz
|
31
|
+
EOS
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
describe "string" do
|
2
|
+
describe "constantize" do
|
3
|
+
module Ace
|
4
|
+
module Base
|
5
|
+
class Case
|
6
|
+
class Dice
|
7
|
+
end
|
8
|
+
end
|
9
|
+
class Fase < Case
|
10
|
+
end
|
11
|
+
end
|
12
|
+
class Gas
|
13
|
+
include Base
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Object
|
18
|
+
module AddtlGlobalConstants
|
19
|
+
class Case
|
20
|
+
class Dice
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
include AddtlGlobalConstants
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should lookup nested constant" do
|
28
|
+
"Ace::Base::Case".constantize.should == Ace::Base::Case
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should lookup nested absolute constant" do
|
32
|
+
"::Ace::Base::Case".constantize.should == Ace::Base::Case
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should lookup nested inherited constant" do
|
36
|
+
"Ace::Base::Fase::Dice".constantize.should == Ace::Base::Fase::Dice
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should lookup nested included constant" do
|
40
|
+
"Ace::Gas::Case".constantize.should == Ace::Gas::Case
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should lookup nested constant included into Object" do
|
44
|
+
"Case::Dice".constantize.should == Case::Dice
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should lookup nested absolute constant included into Object" do
|
48
|
+
"Object::Case::Dice".constantize.should == Case::Dice
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should lookup constant" do
|
52
|
+
"String".constantize.should == String
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should lookup absolute constant" do
|
56
|
+
"::Ace".constantize.should == Ace
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should return Object for empty string" do
|
60
|
+
"".constantize.should == Object
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should return Object for double colon" do
|
64
|
+
"::".constantize.should == Object
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should raise NameError for unknown constant" do
|
68
|
+
lambda { "UnknownClass".constantize }.should.raise NameError
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should raise NameError for unknown nested constant" do
|
72
|
+
lambda { "UnknownClass::Ace".constantize }.should.raise NameError
|
73
|
+
lambda { "UnknownClass::Ace::Base".constantize }.should.raise NameError
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should raise NameError for invalid string" do
|
77
|
+
lambda { "An invalid string".constantize }.should.raise NameError
|
78
|
+
lambda { "InvalidClass\n".constantize }.should.raise NameError
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should raise NameError for nested unknown constant in known constant" do
|
82
|
+
lambda { "Ace::ConstantizeTestCases".constantize }.should.raise NameError
|
83
|
+
lambda { "Ace::Base::ConstantizeTestCases".constantize }.should.raise NameError
|
84
|
+
lambda { "Ace::Gas::Base".constantize }.should.raise NameError
|
85
|
+
lambda { "Ace::Gas::ConstantizeTestCases".constantize }.should.raise NameError
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
describe "Time" do
|
2
|
+
describe "calculations" do
|
3
|
+
describe "seconds_since_midnight" do
|
4
|
+
it "should calculate correctly" do
|
5
|
+
Time.local(2005,1,1,0,0,1).seconds_since_midnight.should == 1
|
6
|
+
Time.local(2005,1,1,0,1,0).seconds_since_midnight.should == 60
|
7
|
+
Time.local(2005,1,1,1,1,0).seconds_since_midnight.should == 3660
|
8
|
+
Time.local(2005,1,1,23,59,59).seconds_since_midnight.should == 86399
|
9
|
+
Time.local(2005,1,1,0,1,0,10).seconds_since_midnight.should == 60.00001
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "seconds_until_end_of_day" do
|
14
|
+
it "should calculate correctly" do
|
15
|
+
Time.local(2005,1,1,23,59,59).seconds_until_end_of_day.should == 0
|
16
|
+
Time.local(2005,1,1,23,59,58).seconds_until_end_of_day.should == 1
|
17
|
+
Time.local(2005,1,1,23,58,59).seconds_until_end_of_day.should == 60
|
18
|
+
Time.local(2005,1,1,22,58,59).seconds_until_end_of_day.should == 3660
|
19
|
+
Time.local(2005,1,1,0,0,0).seconds_until_end_of_day.should == 86399
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "beginning_of_day" do
|
24
|
+
it "should calculate correctly" do
|
25
|
+
Time.local(2005,2,4,10,10,10).beginning_of_day.should == Time.local(2005,2,4,0,0,0)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "beginning_of_hour" do
|
30
|
+
it "should calculate correctly" do
|
31
|
+
Time.local(2005,2,4,19,30,10).beginning_of_hour.should == Time.local(2005,2,4,19,0,0)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "beginning_of_minute" do
|
36
|
+
it "should calculate correctly" do
|
37
|
+
Time.local(2005,2,4,19,30,10).beginning_of_minute.should == Time.local(2005,2,4,19,30,0)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "end_of_day" do
|
42
|
+
it "should calculate correctly" do
|
43
|
+
Time.local(2007,8,12,10,10,10).end_of_day.should == Time.local(2007,8,12,23,59,59,Rational(999999999, 1000))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "end_of_hour" do
|
48
|
+
it "should calculate correctly" do
|
49
|
+
Time.local(2005,2,4,19,30,10).end_of_hour.should == Time.local(2005,2,4,19,59,59,Rational(999999999, 1000))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "end_of_minute" do
|
54
|
+
it "should calculate correctly" do
|
55
|
+
Time.local(2005,2,4,19,30,10).end_of_minute.should == Time.local(2005,2,4,19,30,59,Rational(999999999, 1000))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "last_year" do
|
60
|
+
it "should calculate correctly" do
|
61
|
+
Time.local(2005,6,5,10,0,0).last_year.should == Time.local(2004,6,5,10)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "ago" do
|
66
|
+
it "should calculate correctly" do
|
67
|
+
Time.local(2005,2,22,10,10,10).ago(1).should == Time.local(2005,2,22,10,10,9)
|
68
|
+
Time.local(2005,2,22,10,10,10).ago(3600).should == Time.local(2005,2,22,9,10,10)
|
69
|
+
Time.local(2005,2,22,10,10,10).ago(86400*2).should == Time.local(2005,2,20,10,10,10)
|
70
|
+
Time.local(2005,2,22,10,10,10).ago(86400*2 + 3600 + 25).should == Time.local(2005,2,20,9,9,45)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "since" do
|
75
|
+
it "should calculate correctly" do
|
76
|
+
Time.local(2005,2,22,10,10,10).since(1).should == Time.local(2005,2,22,10,10,11)
|
77
|
+
Time.local(2005,2,22,10,10,10).since(3600).should == Time.local(2005,2,22,11,10,10)
|
78
|
+
Time.local(2005,2,22,10,10,10).since(86400*2).should == Time.local(2005,2,24,10,10,10)
|
79
|
+
Time.local(2005,2,22,10,10,10).since(86400*2 + 3600 + 25).should == Time.local(2005,2,24,11,10,35)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "change" do
|
84
|
+
it "should calculate correctly" do
|
85
|
+
Time.local(2005,2,22,15,15,10).change(:year => 2006).should == Time.local(2006,2,22,15,15,10)
|
86
|
+
Time.local(2005,2,22,15,15,10).change(:month => 6).should == Time.local(2005,6,22,15,15,10)
|
87
|
+
Time.local(2005,2,22,15,15,10).change(:year => 2012, :month => 9).should == Time.local(2012,9,22,15,15,10)
|
88
|
+
Time.local(2005,2,22,15,15,10).change(:hour => 16).should == Time.local(2005,2,22,16)
|
89
|
+
Time.local(2005,2,22,15,15,10).change(:hour => 16, :min => 45).should == Time.local(2005,2,22,16,45)
|
90
|
+
Time.local(2005,2,22,15,15,10).change(:min => 45).should == Time.local(2005,2,22,15,45)
|
91
|
+
|
92
|
+
Time.local(2005,1,2,11,22,33,44).change(:hour => 5).should == Time.local(2005,1,2,5,0,0,0)
|
93
|
+
Time.local(2005,1,2,11,22,33,44).change(:min => 6).should == Time.local(2005,1,2,11,6,0,0)
|
94
|
+
Time.local(2005,1,2,11,22,33,44).change(:sec => 7).should == Time.local(2005,1,2,11,22,7,0)
|
95
|
+
Time.local(2005,1,2,11,22,33,44).change(:usec => 8).should == Time.local(2005,1,2,11,22,33,8)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "advance" do
|
100
|
+
it "should calculate correctly" do
|
101
|
+
Time.local(2005,2,28,15,15,10).advance(:years => 1).should == Time.local(2006,2,28,15,15,10)
|
102
|
+
Time.local(2005,2,28,15,15,10).advance(:months => 4).should == Time.local(2005,6,28,15,15,10)
|
103
|
+
Time.local(2005,2,28,15,15,10).advance(:weeks => 3).should == Time.local(2005,3,21,15,15,10)
|
104
|
+
Time.local(2005,2,28,15,15,10).advance(:weeks => 3.5).should == Time.local(2005,3,25,3,15,10)
|
105
|
+
Time.local(2005,2,28,15,15,10).advance(:days => 5).should == Time.local(2005,3,5,15,15,10)
|
106
|
+
Time.local(2005,2,28,15,15,10).advance(:days => 5.5).should == Time.local(2005,3,6,3,15,10)
|
107
|
+
Time.local(2005,2,28,15,15,10).advance(:years => 7, :months => 7).should == Time.local(2012,9,28,15,15,10)
|
108
|
+
Time.local(2005,2,28,15,15,10).advance(:years => 7, :months => 19, :days => 5).should == Time.local(2013,10,3,15,15,10)
|
109
|
+
Time.local(2005,2,28,15,15,10).advance(:years => 7, :months => 19, :weeks => 2, :days => 5).should == Time.local(2013,10,17,15,15,10)
|
110
|
+
Time.local(2005,2,28,15,15,10).advance(:years => -3, :months => -2, :days => -1).should == Time.local(2001,12,27,15,15,10)
|
111
|
+
Time.local(2004,2,29,15,15,10).advance(:years => 1).should == Time.local(2005,2,28,15,15,10)
|
112
|
+
Time.local(2005,2,28,15,15,10).advance(:hours => 5).should == Time.local(2005,2,28,20,15,10)
|
113
|
+
Time.local(2005,2,28,15,15,10).advance(:minutes => 7).should == Time.local(2005,2,28,15,22,10)
|
114
|
+
Time.local(2005,2,28,15,15,10).advance(:seconds => 9).should == Time.local(2005,2,28,15,15,19)
|
115
|
+
Time.local(2005,2,28,15,15,10).advance(:hours => 5, :minutes => 7, :seconds => 9).should == Time.local(2005,2,28,20,22,19)
|
116
|
+
Time.local(2005,2,28,15,15,10).advance(:hours => -5, :minutes => -7, :seconds => -9).should == Time.local(2005,2,28,10,8,1)
|
117
|
+
Time.local(2005,2,28,15,15,10).advance(:years => 7, :months => 19, :weeks => 2, :days => 5, :hours => 5, :minutes => 7, :seconds => 9).should == Time.local(2013,10,17,20,22,19)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should advance with nsec" do
|
121
|
+
t = Time.at(0, Rational(108635108, 1000))
|
122
|
+
t.advance(:months => 0).should == t
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "days_in_month" do
|
127
|
+
it "should calculate with year" do
|
128
|
+
Time.days_in_month(1, 2005).should == 31
|
129
|
+
|
130
|
+
Time.days_in_month(2, 2005).should == 28
|
131
|
+
Time.days_in_month(2, 2004).should == 29
|
132
|
+
Time.days_in_month(2, 2000).should == 29
|
133
|
+
Time.days_in_month(2, 1900).should == 28
|
134
|
+
|
135
|
+
Time.days_in_month(3, 2005).should == 31
|
136
|
+
Time.days_in_month(4, 2005).should == 30
|
137
|
+
Time.days_in_month(5, 2005).should == 31
|
138
|
+
Time.days_in_month(6, 2005).should == 30
|
139
|
+
Time.days_in_month(7, 2005).should == 31
|
140
|
+
Time.days_in_month(8, 2005).should == 31
|
141
|
+
Time.days_in_month(9, 2005).should == 30
|
142
|
+
Time.days_in_month(10, 2005).should == 31
|
143
|
+
Time.days_in_month(11, 2005).should == 30
|
144
|
+
Time.days_in_month(12, 2005).should == 31
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should calculate for february in common year" do
|
148
|
+
Time.days_in_month(2, 2007).should == 28
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should calculate for february in leap year" do
|
152
|
+
Time.days_in_month(2, 2008).should == 29
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "last_month" do
|
157
|
+
it "should work on the 31st" do
|
158
|
+
Time.local(2004, 3, 31).last_month.should == Time.local(2004, 2, 29)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe "<=>" do
|
163
|
+
it "should compare with time" do
|
164
|
+
(Time.utc(2000) <=> Time.utc(1999, 12, 31, 23, 59, 59, 999)).should == 1
|
165
|
+
(Time.utc(2000) <=> Time.utc(2000, 1, 1, 0, 0, 0)).should == 0
|
166
|
+
(Time.utc(2000) <=> Time.utc(2000, 1, 1, 0, 0, 0, 001)).should == -1
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "all_day" do
|
171
|
+
it "should calculate correctly" do
|
172
|
+
Time.local(2011,6,7,10,10,10).all_day.should == (Time.local(2011,6,7,0,0,0)..Time.local(2011,6,7,23,59,59,Rational(999999999, 1000)))
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "all_week" do
|
177
|
+
it "should calculate correctly" do
|
178
|
+
Time.local(2011,6,7,10,10,10).all_week.should == (Time.local(2011,6,6,0,0,0)..Time.local(2011,6,12,23,59,59,Rational(999999999, 1000)))
|
179
|
+
Time.local(2011,6,7,10,10,10).all_week(:sunday).should == (Time.local(2011,6,5,0,0,0)..Time.local(2011,6,11,23,59,59,Rational(999999999, 1000)))
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "all_month" do
|
184
|
+
it "should calculate correctly" do
|
185
|
+
Time.local(2011,6,7,10,10,10).all_month.should == (Time.local(2011,6,1,0,0,0)..Time.local(2011,6,30,23,59,59,Rational(999999999, 1000)))
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe "all_quarter" do
|
190
|
+
it "should calculate correctly" do
|
191
|
+
Time.local(2011,6,7,10,10,10).all_quarter.should == (Time.local(2011,4,1,0,0,0)..Time.local(2011,6,30,23,59,59,Rational(999999999, 1000)))
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "all_year" do
|
196
|
+
it "should calculate correctly" do
|
197
|
+
Time.local(2011,6,7,10,10,10).all_year.should == (Time.local(2011,1,1,0,0,0)..Time.local(2011,12,31,23,59,59,Rational(999999999, 1000)))
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
describe "Time" do
|
2
|
+
describe "conversions" do
|
3
|
+
describe "to_formatted_s" do
|
4
|
+
before do
|
5
|
+
@time = Time.utc(2005, 2, 21, 17, 44, 30.12345678901)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should use default conversion if no parameter is given" do
|
9
|
+
@time.to_s.should == @time.to_default_s
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should use default conversion if parameter is unknown" do
|
13
|
+
@time.to_s(:doesnt_exist).should == @time.to_default_s
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should convert to db format" do
|
17
|
+
@time.to_s(:db).should == "2005-02-21 17:44:30"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should convert to short format" do
|
21
|
+
@time.to_s(:short).should == "21 Feb 17:44"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should convert to time format" do
|
25
|
+
@time.to_s(:time).should == "17:44"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should convert to number format" do
|
29
|
+
@time.to_s(:number).should == "20050221174430"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should convert to nsec format" do
|
33
|
+
@time.to_s(:nsec).should == "200502211744309N"
|
34
|
+
# Hmm. Looks like RubyMotion has an issue with nanosecs in string time formatting. It should actually be "20050221174430123456789"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should convert to long format" do
|
38
|
+
@time.to_s(:long).should == "February 21, 2005 17:44"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should convert to long_ordinal format" do
|
42
|
+
@time.to_s(:long_ordinal).should == "February 21st, 2005 17:44"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "custom date format" do
|
47
|
+
it "should convert to custom format" do
|
48
|
+
Time::DATE_FORMATS[:custom] = '%Y%m%d%H%M%S'
|
49
|
+
Time.local(2005, 2, 21, 14, 30, 0).to_s(:custom).should == '20050221143000'
|
50
|
+
Time::DATE_FORMATS.delete(:custom)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
describe "Duration" do
|
2
|
+
describe "threequals" do
|
3
|
+
it "should be a day" do
|
4
|
+
MotionSupport::Duration.should === 1.day
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should not be an int" do
|
8
|
+
MotionSupport::Duration.should.not === 1.day.to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should not be a string" do
|
12
|
+
MotionSupport::Duration.should.not === 'foo'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "equals" do
|
17
|
+
it "should equal itself" do
|
18
|
+
1.day.should == 1.day
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should equal integer representation" do
|
22
|
+
1.day.should == 1.day.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not equal string" do
|
26
|
+
1.day.should.not == 'foo'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "inspect" do
|
31
|
+
it "should convert to string representation" do
|
32
|
+
0.seconds.inspect.should == '0 seconds'
|
33
|
+
1.month.inspect.should == '1 month'
|
34
|
+
(1.month + 1.day).inspect.should == '1 month and 1 day'
|
35
|
+
(6.months - 2.days).inspect.should == '6 months and -2 days'
|
36
|
+
10.seconds.inspect.should == '10 seconds'
|
37
|
+
(10.years + 2.months + 1.day).inspect.should == '10 years, 2 months, and 1 day'
|
38
|
+
1.week.inspect.should == '7 days'
|
39
|
+
1.fortnight.inspect.should == '14 days'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "arithmetic" do
|
44
|
+
it "should not break when subtracting time from itself" do
|
45
|
+
lambda { Date.today - Date.today }.should.not.raise
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should add with time" do
|
49
|
+
(1.second + 1).should == 1 + 1.second
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_plus_with_time
|
53
|
+
assert_equal 1 + 1.second, 1.second + 1, "Duration + Numeric should == Numeric + Duration"
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "fractions" do
|
59
|
+
describe "days" do
|
60
|
+
it "should support fractional days" do
|
61
|
+
1.5.weeks.should == (86400 * 7) * 1.5
|
62
|
+
1.7.weeks.should == (86400 * 7) * 1.7
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should support since" do
|
66
|
+
t = 2.years.ago
|
67
|
+
1.5.days.since(t).should == 36.hours.since(t)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should support ago" do
|
71
|
+
t = 2.years.ago
|
72
|
+
1.5.days.ago(t).should == 36.hours.ago(t)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "weeks" do
|
77
|
+
it "should support fractional weeks" do
|
78
|
+
1.5.days.should == 86400 * 1.5
|
79
|
+
1.7.days.should == 86400 * 1.7
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should support since" do
|
83
|
+
t = 2.years.ago
|
84
|
+
1.5.weeks.since(t).should == (7 * 36).hours.since(t)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should support ago" do
|
88
|
+
t = 2.years.ago
|
89
|
+
1.5.weeks.ago(t).should == (7 * 36).hours.ago(t)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "delegation" do
|
95
|
+
it "should delegate with block" do
|
96
|
+
counter = 0
|
97
|
+
lambda { 1.minute.times { counter += 1 } }.should.not.raise
|
98
|
+
counter.should == 60
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "to_json" do
|
103
|
+
it "should convert to json" do
|
104
|
+
2.days.to_json.should == '172800'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|