finitio 0.4.1 → 0.5.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.
Files changed (270) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +66 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +34 -30
  5. data/finitio.gemspec +1 -1
  6. data/lib/finitio.rb +7 -39
  7. data/lib/finitio/errors.rb +14 -0
  8. data/lib/finitio/support.rb +4 -1
  9. data/lib/finitio/support/attribute.rb +13 -7
  10. data/lib/finitio/support/compilation.rb +55 -0
  11. data/lib/finitio/support/constraint.rb +46 -0
  12. data/lib/finitio/support/contract.rb +33 -0
  13. data/lib/finitio/support/dress_helper.rb +3 -2
  14. data/lib/finitio/support/heading.rb +57 -17
  15. data/lib/finitio/support/metadata.rb +20 -0
  16. data/lib/finitio/support/type_factory.rb +154 -41
  17. data/lib/finitio/syntax.rb +16 -31
  18. data/lib/finitio/syntax/expr.rb +56 -0
  19. data/lib/finitio/syntax/expr/arith_op.rb +22 -0
  20. data/lib/finitio/syntax/expr/comparison.rb +22 -0
  21. data/lib/finitio/syntax/expr/fn_call.rb +24 -0
  22. data/lib/finitio/syntax/expr/identifier.rb +18 -0
  23. data/lib/finitio/syntax/expr/literal.rb +19 -0
  24. data/lib/finitio/syntax/expr/logic_dyadic.rb +22 -0
  25. data/lib/finitio/syntax/expr/logic_not.rb +21 -0
  26. data/lib/finitio/syntax/expr/oo_call.rb +24 -0
  27. data/lib/finitio/syntax/expr/parenthesized.rb +20 -0
  28. data/lib/finitio/syntax/expr/unary_minus_op.rb +21 -0
  29. data/lib/finitio/syntax/expressions.citrus +129 -0
  30. data/lib/finitio/syntax/finitio.citrus +10 -208
  31. data/lib/finitio/syntax/finitio.sexp +5 -1
  32. data/lib/finitio/syntax/lexer.citrus +91 -0
  33. data/lib/finitio/syntax/literal.rb +16 -0
  34. data/lib/finitio/syntax/literal/boolean.rb +22 -0
  35. data/lib/finitio/syntax/literal/integer.rb +14 -0
  36. data/lib/finitio/syntax/literal/real.rb +14 -0
  37. data/lib/finitio/syntax/literal/string.rb +14 -0
  38. data/lib/finitio/syntax/literals.citrus +44 -0
  39. data/lib/finitio/syntax/node.rb +53 -0
  40. data/lib/finitio/syntax/type.rb +28 -0
  41. data/lib/finitio/syntax/type/ad_type.rb +29 -0
  42. data/lib/finitio/syntax/{any_type.rb → type/any_type.rb} +1 -1
  43. data/lib/finitio/syntax/type/attribute.rb +33 -0
  44. data/lib/finitio/syntax/{builtin_type.rb → type/builtin_type.rb} +3 -1
  45. data/lib/finitio/syntax/{constraint_def.rb → type/constraint_def.rb} +4 -3
  46. data/lib/finitio/syntax/type/constraints.rb +17 -0
  47. data/lib/finitio/syntax/{contract.rb → type/contract.rb} +9 -3
  48. data/lib/finitio/syntax/{definitions.rb → type/definitions.rb} +1 -0
  49. data/lib/finitio/syntax/{expression.rb → type/expression.rb} +2 -1
  50. data/lib/finitio/syntax/{external_pair.rb → type/external_pair.rb} +3 -1
  51. data/lib/finitio/syntax/type/heading.rb +30 -0
  52. data/lib/finitio/syntax/{inline_pair.rb → type/inline_pair.rb} +3 -1
  53. data/lib/finitio/syntax/{lambda_expr.rb → type/lambda_expr.rb} +3 -0
  54. data/lib/finitio/syntax/type/main_type.rb +18 -0
  55. data/lib/finitio/syntax/type/metadata.rb +18 -0
  56. data/lib/finitio/syntax/type/metadata_attr.rb +15 -0
  57. data/lib/finitio/syntax/{named_constraint.rb → type/named_constraint.rb} +10 -3
  58. data/lib/finitio/syntax/type/relation_type.rb +24 -0
  59. data/lib/finitio/syntax/{seq_type.rb → type/seq_type.rb} +3 -0
  60. data/lib/finitio/syntax/{set_type.rb → type/set_type.rb} +3 -0
  61. data/lib/finitio/syntax/type/struct_type.rb +17 -0
  62. data/lib/finitio/syntax/{sub_type.rb → type/sub_type.rb} +3 -0
  63. data/lib/finitio/syntax/{system.rb → type/system.rb} +5 -4
  64. data/lib/finitio/syntax/type/tuple_type.rb +24 -0
  65. data/lib/finitio/syntax/{type_def.rb → type/type_def.rb} +8 -3
  66. data/lib/finitio/syntax/{type_ref.rb → type/type_ref.rb} +4 -1
  67. data/lib/finitio/syntax/{union_type.rb → type/union_type.rb} +1 -0
  68. data/lib/finitio/syntax/{unnamed_constraint.rb → type/unnamed_constraint.rb} +7 -1
  69. data/lib/finitio/syntax/types.citrus +196 -0
  70. data/lib/finitio/system.rb +15 -15
  71. data/lib/finitio/type.rb +38 -6
  72. data/lib/finitio/type/ad_type.rb +41 -18
  73. data/lib/finitio/type/alias_type.rb +37 -0
  74. data/lib/finitio/type/any_type.rb +7 -3
  75. data/lib/finitio/type/builtin_type.rb +5 -4
  76. data/lib/finitio/{support → type}/collection_type.rb +3 -4
  77. data/lib/finitio/type/hash_based_type.rb +91 -0
  78. data/lib/finitio/type/heading_based_type.rb +28 -0
  79. data/lib/finitio/type/multi_relation_type.rb +34 -0
  80. data/lib/finitio/type/multi_tuple_type.rb +29 -0
  81. data/lib/finitio/type/proxy_type.rb +40 -0
  82. data/lib/finitio/type/rel_based_type.rb +42 -0
  83. data/lib/finitio/type/relation_type.rb +6 -47
  84. data/lib/finitio/type/seq_type.rb +4 -0
  85. data/lib/finitio/type/set_type.rb +4 -0
  86. data/lib/finitio/type/struct_type.rb +84 -0
  87. data/lib/finitio/type/sub_type.rb +25 -22
  88. data/lib/finitio/type/tuple_type.rb +6 -57
  89. data/lib/finitio/type/union_type.rb +12 -5
  90. data/lib/finitio/version.rb +2 -2
  91. data/spec/{unit/attribute → attribute}/test_equality.rb +8 -5
  92. data/spec/{unit/attribute → attribute}/test_fetch_on.rb +5 -5
  93. data/spec/attribute/test_initialize.rb +26 -0
  94. data/spec/attribute/test_optional.rb +18 -0
  95. data/spec/attribute/test_required.rb +18 -0
  96. data/spec/attribute/test_to_name.rb +20 -0
  97. data/spec/constraint/test_anonymous.rb +20 -0
  98. data/spec/constraint/test_equality.rb +39 -0
  99. data/spec/constraint/test_name.rb +20 -0
  100. data/spec/constraint/test_named.rb +20 -0
  101. data/spec/constraint/test_triple_equal.rb +13 -0
  102. data/spec/{unit/qrb/system.q → finitio/system.fio} +0 -0
  103. data/spec/{unit/qrb → finitio}/test_ast.rb +0 -0
  104. data/spec/finitio/test_parse.rb +23 -0
  105. data/spec/{unit/qrb/test_parse.rb → finitio/test_system.rb} +6 -6
  106. data/spec/heading/test_allow_extra.rb +24 -0
  107. data/spec/{unit/heading → heading}/test_each.rb +2 -2
  108. data/spec/heading/test_equality.rb +38 -0
  109. data/spec/heading/test_hash.rb +38 -0
  110. data/spec/heading/test_hash_get.rb +17 -0
  111. data/spec/{unit/heading → heading}/test_initialize.rb +2 -2
  112. data/spec/heading/test_multi.rb +57 -0
  113. data/spec/{unit/heading → heading}/test_size.rb +0 -0
  114. data/spec/heading/test_to_name.rb +58 -0
  115. data/spec/spec_helper.rb +17 -1
  116. data/spec/syntax/expr/test_free_variables.rb +46 -0
  117. data/spec/syntax/expr/test_to_proc_source.rb +43 -0
  118. data/spec/{unit/syntax → syntax}/nodes/test_ad_type.rb +26 -26
  119. data/spec/{unit/syntax → syntax}/nodes/test_any_type.rb +2 -2
  120. data/spec/syntax/nodes/test_attribute.rb +65 -0
  121. data/spec/{unit/syntax → syntax}/nodes/test_builtin_type.rb +5 -5
  122. data/spec/{unit/syntax → syntax}/nodes/test_comment.rb +1 -1
  123. data/spec/{unit/syntax → syntax}/nodes/test_constraint_def.rb +3 -8
  124. data/spec/{unit/syntax → syntax}/nodes/test_constraints.rb +21 -16
  125. data/spec/{unit/syntax → syntax}/nodes/test_contract.rb +28 -35
  126. data/spec/{unit/syntax → syntax}/nodes/test_expression.rb +13 -5
  127. data/spec/{unit/syntax → syntax}/nodes/test_heading.rb +25 -7
  128. data/spec/syntax/nodes/test_metadata.rb +28 -0
  129. data/spec/{unit/syntax → syntax}/nodes/test_named_constraint.rb +8 -8
  130. data/spec/syntax/nodes/test_relation_type.rb +84 -0
  131. data/spec/{unit/syntax → syntax}/nodes/test_seq_type.rb +4 -4
  132. data/spec/{unit/syntax → syntax}/nodes/test_set_type.rb +4 -4
  133. data/spec/{unit/syntax → syntax}/nodes/test_spacing.rb +1 -1
  134. data/spec/syntax/nodes/test_struct_type.rb +38 -0
  135. data/spec/{unit/syntax → syntax}/nodes/test_sub_type.rb +14 -14
  136. data/spec/{unit/syntax → syntax}/nodes/test_system.rb +3 -3
  137. data/spec/syntax/nodes/test_tuple_type.rb +94 -0
  138. data/spec/syntax/nodes/test_type_def.rb +57 -0
  139. data/spec/{unit/syntax → syntax}/nodes/test_type_ref.rb +3 -3
  140. data/spec/{unit/syntax → syntax}/nodes/test_union_type.rb +3 -3
  141. data/spec/{unit/syntax → syntax}/nodes/test_unnamed_constraint.rb +7 -7
  142. data/spec/syntax/test_compile.rb +41 -0
  143. data/spec/{unit/syntax → syntax}/test_compile_type.rb +1 -1
  144. data/spec/{unit/system → system}/test_add_type.rb +6 -6
  145. data/spec/{unit/system → system}/test_dsl.rb +2 -2
  146. data/spec/{unit/system → system}/test_dup.rb +4 -4
  147. data/spec/{unit/system → system}/test_fetch.rb +4 -4
  148. data/spec/{unit/system → system}/test_get_type.rb +2 -2
  149. data/spec/{unit/system → system}/test_initialize.rb +0 -0
  150. data/spec/test_finitio.rb +8 -0
  151. data/spec/{unit/type → type}/ad_type/test_default_name.rb +1 -2
  152. data/spec/{unit/type → type}/ad_type/test_dress.rb +19 -9
  153. data/spec/{unit/type → type}/ad_type/test_include.rb +3 -3
  154. data/spec/{unit/type → type}/ad_type/test_initialize.rb +15 -8
  155. data/spec/{unit/type → type}/ad_type/test_name.rb +2 -2
  156. data/spec/type/alias_type/test_default_name.rb +10 -0
  157. data/spec/type/alias_type/test_delegation.rb +29 -0
  158. data/spec/type/alias_type/test_name.rb +10 -0
  159. data/spec/{unit/type → type}/any_type/test_default_name.rb +1 -1
  160. data/spec/{unit/type → type}/any_type/test_dress.rb +0 -0
  161. data/spec/{unit/type → type}/any_type/test_equality.rb +4 -4
  162. data/spec/{unit/type → type}/any_type/test_include.rb +2 -2
  163. data/spec/{unit/type → type}/any_type/test_initialize.rb +0 -0
  164. data/spec/{unit/type → type}/any_type/test_name.rb +2 -2
  165. data/spec/{unit/type → type}/builtin_type/test_default_name.rb +1 -1
  166. data/spec/{unit/type → type}/builtin_type/test_dress.rb +3 -3
  167. data/spec/{unit/type → type}/builtin_type/test_equality.rb +4 -4
  168. data/spec/{unit/type → type}/builtin_type/test_include.rb +2 -2
  169. data/spec/{unit/type → type}/builtin_type/test_initialize.rb +1 -1
  170. data/spec/{unit/type → type}/builtin_type/test_name.rb +2 -2
  171. data/spec/type/multi_relation_type/test_default_name.rb +19 -0
  172. data/spec/type/multi_relation_type/test_dress.rb +206 -0
  173. data/spec/type/multi_relation_type/test_equality.rb +36 -0
  174. data/spec/type/multi_relation_type/test_include.rb +89 -0
  175. data/spec/type/multi_relation_type/test_initialize.rb +29 -0
  176. data/spec/type/multi_relation_type/test_name.rb +27 -0
  177. data/spec/type/multi_tuple_type/test_default_name.rb +17 -0
  178. data/spec/type/multi_tuple_type/test_dress.rb +146 -0
  179. data/spec/type/multi_tuple_type/test_equality.rb +32 -0
  180. data/spec/type/multi_tuple_type/test_include.rb +73 -0
  181. data/spec/type/multi_tuple_type/test_initialize.rb +30 -0
  182. data/spec/type/multi_tuple_type/test_name.rb +24 -0
  183. data/spec/type/proxy_type/test_delegation.rb +37 -0
  184. data/spec/type/proxy_type/test_resolve.rb +29 -0
  185. data/spec/{unit/type → type}/relation_type/test_default_name.rb +0 -0
  186. data/spec/{unit/type → type}/relation_type/test_dress.rb +24 -24
  187. data/spec/{unit/type → type}/relation_type/test_equality.rb +6 -6
  188. data/spec/{unit/type → type}/relation_type/test_include.rb +4 -4
  189. data/spec/{unit/type → type}/relation_type/test_initialize.rb +2 -2
  190. data/spec/{unit/type → type}/relation_type/test_name.rb +0 -0
  191. data/spec/{unit/type → type}/seq_type/test_default_name.rb +0 -0
  192. data/spec/{unit/type → type}/seq_type/test_dress.rb +5 -5
  193. data/spec/{unit/type → type}/seq_type/test_equality.rb +4 -4
  194. data/spec/{unit/type → type}/seq_type/test_include.rb +4 -4
  195. data/spec/{unit/type → type}/seq_type/test_initialize.rb +3 -3
  196. data/spec/{unit/type → type}/seq_type/test_name.rb +0 -0
  197. data/spec/{unit/type → type}/set_type/test_default_name.rb +0 -0
  198. data/spec/{unit/type → type}/set_type/test_dress.rb +8 -8
  199. data/spec/{unit/type → type}/set_type/test_equality.rb +4 -4
  200. data/spec/{unit/type → type}/set_type/test_include.rb +4 -4
  201. data/spec/{unit/type → type}/set_type/test_initialize.rb +3 -3
  202. data/spec/{unit/type → type}/set_type/test_name.rb +0 -0
  203. data/spec/type/struct_type/test_default_name.rb +10 -0
  204. data/spec/type/struct_type/test_dress.rb +105 -0
  205. data/spec/type/struct_type/test_equality.rb +28 -0
  206. data/spec/type/struct_type/test_include.rb +40 -0
  207. data/spec/type/struct_type/test_initialize.rb +22 -0
  208. data/spec/type/struct_type/test_name.rb +20 -0
  209. data/spec/{unit/type → type}/sub_type/test_default_name.rb +2 -2
  210. data/spec/{unit/type → type}/sub_type/test_dress.rb +14 -14
  211. data/spec/type/sub_type/test_equality.rb +46 -0
  212. data/spec/{unit/type → type}/sub_type/test_include.rb +6 -6
  213. data/spec/type/sub_type/test_initialize.rb +13 -0
  214. data/spec/{unit/type → type}/sub_type/test_name.rb +4 -4
  215. data/spec/{unit/type → type}/tuple_type/test_default_name.rb +0 -0
  216. data/spec/{unit/type → type}/tuple_type/test_dress.rb +18 -18
  217. data/spec/{unit/type → type}/tuple_type/test_equality.rb +6 -6
  218. data/spec/{unit/type → type}/tuple_type/test_include.rb +4 -4
  219. data/spec/{unit/type → type}/tuple_type/test_initialize.rb +4 -4
  220. data/spec/{unit/type → type}/tuple_type/test_name.rb +0 -0
  221. data/spec/{unit/type → type}/union_type/test_default_name.rb +0 -0
  222. data/spec/{unit/type → type}/union_type/test_dress.rb +7 -6
  223. data/spec/{unit/type → type}/union_type/test_equality.rb +7 -7
  224. data/spec/{unit/type → type}/union_type/test_include.rb +3 -3
  225. data/spec/{unit/type → type}/union_type/test_initialize.rb +3 -3
  226. data/spec/{unit/type → type}/union_type/test_name.rb +0 -0
  227. data/spec/{unit/type_factory → type_factory}/dsl/test_adt.rb +4 -4
  228. data/spec/{unit/type_factory → type_factory}/dsl/test_any.rb +1 -1
  229. data/spec/{unit/type_factory → type_factory}/dsl/test_attribute.rb +16 -2
  230. data/spec/{unit/type_factory → type_factory}/dsl/test_attributes.rb +1 -1
  231. data/spec/{unit/type_factory → type_factory}/dsl/test_builtin.rb +3 -3
  232. data/spec/type_factory/dsl/test_multi_relation.rb +39 -0
  233. data/spec/type_factory/dsl/test_multi_tuple.rb +37 -0
  234. data/spec/{unit/type_factory → type_factory}/dsl/test_relation.rb +6 -6
  235. data/spec/{unit/type_factory → type_factory}/dsl/test_seq.rb +4 -4
  236. data/spec/{unit/type_factory → type_factory}/dsl/test_set.rb +4 -4
  237. data/spec/type_factory/dsl/test_struct.rb +45 -0
  238. data/spec/{unit/type_factory → type_factory}/dsl/test_subtype.rb +10 -8
  239. data/spec/{unit/type_factory → type_factory}/dsl/test_tuple.rb +5 -5
  240. data/spec/{unit/type_factory → type_factory}/dsl/test_union.rb +6 -6
  241. data/spec/{unit/type_factory → type_factory}/factory/test_builtin.rb +1 -1
  242. data/spec/{unit/type_factory → type_factory}/factory/test_seq_type.rb +2 -2
  243. data/spec/{unit/type_factory → type_factory}/factory/test_set_type.rb +2 -2
  244. data/spec/type_factory/factory/test_struct_type.rb +18 -0
  245. data/spec/{unit/type_factory → type_factory}/factory/test_sub_type.rb +7 -7
  246. data/spec/{unit/type_factory → type_factory}/factory/test_tuple_type.rb +4 -4
  247. metadata +398 -286
  248. data/lib/finitio/data_type.rb +0 -29
  249. data/lib/finitio/syntax/ad_type.rb +0 -32
  250. data/lib/finitio/syntax/attribute.rb +0 -15
  251. data/lib/finitio/syntax/constraints.rb +0 -22
  252. data/lib/finitio/syntax/heading.rb +0 -19
  253. data/lib/finitio/syntax/relation_type.rb +0 -15
  254. data/lib/finitio/syntax/support.rb +0 -13
  255. data/lib/finitio/syntax/tuple_type.rb +0 -15
  256. data/spec/acceptance/Finitio/test_default.rb +0 -96
  257. data/spec/acceptance/Finitio/test_parsing.rb +0 -15
  258. data/spec/acceptance/ad_type/test_in_finitio.rb +0 -82
  259. data/spec/acceptance/ad_type/test_in_ruby.rb +0 -60
  260. data/spec/unit/attribute/test_initialize.rb +0 -13
  261. data/spec/unit/attribute/test_to_name.rb +0 -10
  262. data/spec/unit/heading/test_equality.rb +0 -28
  263. data/spec/unit/heading/test_to_name.rb +0 -32
  264. data/spec/unit/syntax/nodes/test_attribute.rb +0 -38
  265. data/spec/unit/syntax/nodes/test_relation_type.rb +0 -59
  266. data/spec/unit/syntax/nodes/test_tuple_type.rb +0 -59
  267. data/spec/unit/syntax/nodes/test_type_def.rb +0 -33
  268. data/spec/unit/test_finitio.rb +0 -15
  269. data/spec/unit/type/sub_type/test_equality.rb +0 -34
  270. data/spec/unit/type/sub_type/test_initialize.rb +0 -16
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Attribute, "initialize" do
4
+
5
+ context 'when implicitely required' do
6
+ subject{ Attribute.new(:red, intType) }
7
+
8
+ it 'should correctly set the instance variables' do
9
+ expect(subject.name).to eq(:red)
10
+ expect(subject.type).to eq(intType)
11
+ expect(subject).to be_required
12
+ end
13
+ end
14
+
15
+ context 'when not required' do
16
+ subject{ Attribute.new(:red, intType, false) }
17
+
18
+ it 'should correctly set the instance variables' do
19
+ expect(subject.name).to eq(:red)
20
+ expect(subject.type).to eq(intType)
21
+ expect(subject).not_to be_required
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Attribute, "optional?" do
4
+
5
+ it 'is false by default' do
6
+ expect(Attribute.new(:red, intType)).not_to be_optional
7
+ end
8
+
9
+ it 'is is the reverse of required' do
10
+ expect(Attribute.new(:red, intType, false)).to be_optional
11
+ end
12
+
13
+ it 'is is the reverse of !required' do
14
+ expect(Attribute.new(:red, intType, true)).not_to be_optional
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Attribute, "required?" do
4
+
5
+ it 'is true by default' do
6
+ expect(Attribute.new(:red, intType)).to be_required
7
+ end
8
+
9
+ it 'is can be set to true' do
10
+ expect(Attribute.new(:red, intType, true)).to be_required
11
+ end
12
+
13
+ it 'is can be set to false' do
14
+ expect(Attribute.new(:red, intType, false)).not_to be_required
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Attribute, "to_name" do
4
+
5
+ subject{ attr.to_name }
6
+
7
+ context 'when required' do
8
+ let(:attr){ Attribute.new(:red, intType) }
9
+
10
+ it{ should eq("red: intType") }
11
+ end
12
+
13
+ context 'when not required' do
14
+ let(:attr){ Attribute.new(:red, intType, false) }
15
+
16
+ it{ should eq("red :? intType") }
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Constraint, "anonymous?" do
4
+
5
+ subject{ constraint.anonymous? }
6
+
7
+ context 'with an unnamed constraint' do
8
+ let(:constraint){ Constraint.new(byte_full) }
9
+
10
+ it{ should eq(true) }
11
+ end
12
+
13
+ context 'with a named constraint' do
14
+ let(:constraint){ Constraint.new(byte_full, :byte) }
15
+
16
+ it{ should eq(false) }
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Constraint, "==" do
4
+
5
+ def constraint(proc, name = nil)
6
+ Constraint.new(proc, name)
7
+ end
8
+
9
+ it 'recognizes same procs' do
10
+ expect(constraint(byte_min)).to eq(constraint(byte_min))
11
+ end
12
+
13
+ it 'recognizes non constraints' do
14
+ expect(constraint(byte_min)).not_to eq(nil)
15
+ expect(constraint(byte_min)).not_to eq(1)
16
+ end
17
+
18
+ it 'recognizes non equivalent constraints' do
19
+ expect(constraint(byte_min)).not_to eq(constraint(byte_max))
20
+ end
21
+
22
+ it 'does not take name into accound' do
23
+ expect(constraint(byte_min, :foo)).to eq(constraint(byte_min, :bar))
24
+ end
25
+
26
+ it 'implements hash accordingly' do
27
+ c1 = constraint(byte_min)
28
+ c2 = constraint(byte_min)
29
+ expect(c1.hash).to eq(c2.hash)
30
+ end
31
+
32
+ it 'is smart enough to have different hash codes for different constraints' do
33
+ c1 = constraint(byte_min)
34
+ c2 = constraint(byte_max)
35
+ expect(c1.hash).not_to eq(c2.hash)
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Constraint, "name" do
4
+
5
+ subject{ constraint.name }
6
+
7
+ context 'with an unnamed constraint' do
8
+ let(:constraint){ Constraint.new(byte_full) }
9
+
10
+ it{ should eq(:default) }
11
+ end
12
+
13
+ context 'with a named constraint' do
14
+ let(:constraint){ Constraint.new(byte_full, :byte) }
15
+
16
+ it{ should eq(:byte) }
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Constraint, "named?" do
4
+
5
+ subject{ constraint.named? }
6
+
7
+ context 'with an unnamed constraint' do
8
+ let(:constraint){ Constraint.new(byte_full) }
9
+
10
+ it{ should eq(false) }
11
+ end
12
+
13
+ context 'with a named constraint' do
14
+ let(:constraint){ Constraint.new(byte_full, :byte) }
15
+
16
+ it{ should eq(true) }
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Constraint, "===" do
4
+
5
+ let(:constraint){ Constraint.new(byte_full) }
6
+
7
+ it 'delegates to the proc' do
8
+ expect(constraint.===(17)).to eq(true)
9
+ expect(constraint.===(1700)).to eq(false)
10
+ end
11
+
12
+ end
13
+ end
File without changes
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ describe Finitio, "parse" do
3
+
4
+ context 'with a string' do
5
+ subject{
6
+ Finitio.parse <<-EOF
7
+ Posint = .Fixnum( i | i>=0 )
8
+ Point = { x: Posint, y: Posint }
9
+ EOF
10
+ }
11
+
12
+ it{ should be_a(Finitio::Syntax::System) }
13
+ end
14
+
15
+ context 'with a Path' do
16
+ subject{
17
+ Finitio.parse(Path.dir/"system.fio")
18
+ }
19
+
20
+ it{ should be_a(Finitio::Syntax::System) }
21
+ end
22
+
23
+ end
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
- describe Finitio, "parse" do
2
+ describe Finitio, "system" do
3
3
 
4
4
  context 'with a string' do
5
5
  subject{
6
- Finitio.parse <<-EOF
6
+ Finitio.system <<-EOF
7
7
  Posint = .Fixnum( i | i>=0 )
8
8
  Point = { x: Posint, y: Posint }
9
9
  EOF
@@ -12,20 +12,20 @@ describe Finitio, "parse" do
12
12
  it{ should be_a(Finitio::System) }
13
13
 
14
14
  it 'should have the expected types' do
15
- subject["Posint"].should be_a(Finitio::SubType)
16
- subject["Point"].should be_a(Finitio::TupleType)
15
+ expect(subject["Posint"]).to be_a(Finitio::SubType)
16
+ expect(subject["Point"]).to be_a(Finitio::TupleType)
17
17
  end
18
18
  end
19
19
 
20
20
  context 'with a Path' do
21
21
  subject{
22
- Finitio.parse(Path.dir/"system.q")
22
+ Finitio.system(Path.dir/"system.fio")
23
23
  }
24
24
 
25
25
  it{ should be_a(Finitio::System) }
26
26
 
27
27
  it 'should have the expected types' do
28
- subject["Posint"].should be_a(Finitio::SubType)
28
+ expect(subject["Posint"]).to be_a(Finitio::SubType)
29
29
  end
30
30
  end
31
31
 
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Heading, "allow_extra" do
4
+
5
+ let(:r){ Attribute.new(:r, intType) }
6
+
7
+ def heading(attributes, options = nil)
8
+ Heading.new(attributes, options)
9
+ end
10
+
11
+ it 'is false by default' do
12
+ expect(heading([r])).not_to be_allow_extra
13
+ end
14
+
15
+ it 'can be set to true' do
16
+ expect(heading([r], allow_extra: true)).to be_allow_extra
17
+ end
18
+
19
+ it 'can be set to false explicitely' do
20
+ expect(heading([r], allow_extra: false)).not_to be_allow_extra
21
+ end
22
+
23
+ end
24
+ end
@@ -9,7 +9,7 @@ module Finitio
9
9
  context 'without a block' do
10
10
 
11
11
  it 'should return an enumerator' do
12
- h.each.should be_a(Enumerator)
12
+ expect(h.each).to be_a(Enumerator)
13
13
  end
14
14
  end
15
15
 
@@ -20,7 +20,7 @@ module Finitio
20
20
  h.each do |attr|
21
21
  seen << attr
22
22
  end
23
- seen.should eq([a, b])
23
+ expect(seen).to eq([a, b])
24
24
  end
25
25
  end
26
26
 
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Heading, "equality" do
4
+
5
+ let(:r) { Attribute.new(:r, intType) }
6
+ let(:b) { Attribute.new(:b, intType) }
7
+ let(:maybe_r){ Attribute.new(:r, intType, false) }
8
+
9
+ def heading(attributes, options = nil)
10
+ Heading.new(attributes, options)
11
+ end
12
+
13
+ it 'does not put significance to attributes ordering' do
14
+ expect(heading([r, b])).to eq(heading([b, r]))
15
+ end
16
+
17
+ it 'distinguishes between different attribute sets' do
18
+ expect(heading([r])).not_to eq(heading([b]))
19
+ end
20
+
21
+ it 'distinguishes between attribute obligations' do
22
+ expect(heading([r])).not_to eq(heading([maybe_r]))
23
+ end
24
+
25
+ it 'distinguishes between extra allowance' do
26
+ h1 = heading([r], allow_extra: true)
27
+ h2 = heading([r], allow_extra: false)
28
+ expect(h1).not_to eq(h2)
29
+ end
30
+
31
+ it 'distinguishes between attribute types' do
32
+ a1 = Attribute.new(:r, intType)
33
+ a2 = Attribute.new(:r, floatType)
34
+ expect(heading([a1])).not_to eq(heading([a2]))
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Heading, "hash" do
4
+
5
+ let(:r) { Attribute.new(:r, intType) }
6
+ let(:b) { Attribute.new(:b, intType) }
7
+ let(:maybe_r){ Attribute.new(:r, intType, false) }
8
+
9
+ def heading(attributes, options = nil)
10
+ Heading.new(attributes, options)
11
+ end
12
+
13
+ it 'returns same code on equal headings' do
14
+ expect(heading([r]).hash).to eq(heading([r]).hash)
15
+ end
16
+
17
+ it 'does not put significance to attributes ordering' do
18
+ expect(heading([r, b]).hash).to eq(heading([b, r]).hash)
19
+ end
20
+
21
+ it 'is good enough to distinguish between attribute obligations' do
22
+ expect(heading([r]).hash).not_to eq(heading([maybe_r]).hash)
23
+ end
24
+
25
+ it 'is good enough to distinguish between extra allowance' do
26
+ h1 = heading([r], allow_extra: true)
27
+ h2 = heading([r], allow_extra: false)
28
+ expect(h1.hash).not_to eq(h2.hash)
29
+ end
30
+
31
+ it 'is be good enough to distinguish between different headings' do
32
+ a1 = Attribute.new(:r, intType)
33
+ a2 = Attribute.new(:r, floatType)
34
+ expect(heading([a1]).hash).not_to eq(heading([a2]).hash)
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Heading, "[]" do
4
+
5
+ let(:a){ Attribute.new(:a, intType) }
6
+ let(:h){ Heading.new([a]) }
7
+
8
+ it 'returns the attribute by name' do
9
+ expect(h[:a]).to be(a)
10
+ end
11
+
12
+ it 'returns nil if no such attribute' do
13
+ expect(h[:b]).to be_nil
14
+ end
15
+
16
+ end
17
+ end
@@ -26,9 +26,9 @@ module Finitio
26
26
  }
27
27
 
28
28
  it 'should raise an error' do
29
- ->{
29
+ expect{
30
30
  subject
31
- }.should raise_error(ArgumentError, "Attribute names must be unique")
31
+ }.to raise_error(ArgumentError, "Attribute names must be unique")
32
32
  end
33
33
  end
34
34
 
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ module Finitio
3
+ describe Heading, "multi?" do
4
+
5
+ let(:red){
6
+ Attribute.new(:red, intType)
7
+ }
8
+
9
+ let(:blue){
10
+ Attribute.new(:blue, floatType)
11
+ }
12
+
13
+ let(:maybe_blue){
14
+ Attribute.new(:blue, floatType, false)
15
+ }
16
+
17
+ subject{ Heading.new(attributes, options).multi? }
18
+
19
+ let(:options){ nil }
20
+
21
+ context 'with no attribute' do
22
+ let(:attributes){
23
+ [ ]
24
+ }
25
+
26
+ it{ should eq(false) }
27
+ end
28
+
29
+ context 'with required attributes only' do
30
+ let(:attributes){
31
+ [ red, blue ]
32
+ }
33
+
34
+ it{ should eq(false) }
35
+ end
36
+
37
+ context 'with some optional attributes' do
38
+ let(:attributes){
39
+ [ red, maybe_blue ]
40
+ }
41
+
42
+ it{ should eq(true) }
43
+ end
44
+
45
+ context 'with allow_extra set to true' do
46
+ let(:attributes){
47
+ [ red, blue ]
48
+ }
49
+ let(:options){
50
+ {allow_extra: true}
51
+ }
52
+
53
+ it{ should eq(true) }
54
+ end
55
+
56
+ end
57
+ end