qrb 0.1.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 (159) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/Gemfile +12 -0
  3. data/Gemfile.lock +58 -0
  4. data/LICENCE.md +22 -0
  5. data/Manifest.txt +11 -0
  6. data/README.md +118 -0
  7. data/Rakefile +11 -0
  8. data/lib/qrb/Q/default.q +29 -0
  9. data/lib/qrb/data_type.rb +23 -0
  10. data/lib/qrb/errors.rb +23 -0
  11. data/lib/qrb/support/attribute.rb +53 -0
  12. data/lib/qrb/support/collection_type.rb +25 -0
  13. data/lib/qrb/support/dress_helper.rb +68 -0
  14. data/lib/qrb/support/heading.rb +57 -0
  15. data/lib/qrb/support/type_factory.rb +178 -0
  16. data/lib/qrb/support.rb +5 -0
  17. data/lib/qrb/syntax/ad_type.rb +25 -0
  18. data/lib/qrb/syntax/attribute.rb +11 -0
  19. data/lib/qrb/syntax/builtin_type.rb +13 -0
  20. data/lib/qrb/syntax/constraint_def.rb +11 -0
  21. data/lib/qrb/syntax/constraints.rb +18 -0
  22. data/lib/qrb/syntax/contract.rb +25 -0
  23. data/lib/qrb/syntax/definitions.rb +14 -0
  24. data/lib/qrb/syntax/expression.rb +12 -0
  25. data/lib/qrb/syntax/heading.rb +15 -0
  26. data/lib/qrb/syntax/lambda_expr.rb +11 -0
  27. data/lib/qrb/syntax/named_constraint.rb +11 -0
  28. data/lib/qrb/syntax/q.citrus +195 -0
  29. data/lib/qrb/syntax/relation_type.rb +11 -0
  30. data/lib/qrb/syntax/seq_type.rb +12 -0
  31. data/lib/qrb/syntax/set_type.rb +12 -0
  32. data/lib/qrb/syntax/sub_type.rb +13 -0
  33. data/lib/qrb/syntax/support.rb +13 -0
  34. data/lib/qrb/syntax/system.rb +15 -0
  35. data/lib/qrb/syntax/tuple_type.rb +11 -0
  36. data/lib/qrb/syntax/type_def.rb +14 -0
  37. data/lib/qrb/syntax/type_ref.rb +13 -0
  38. data/lib/qrb/syntax/union_type.rb +12 -0
  39. data/lib/qrb/syntax/unnamed_constraint.rb +11 -0
  40. data/lib/qrb/syntax.rb +42 -0
  41. data/lib/qrb/system.rb +63 -0
  42. data/lib/qrb/type/ad_type.rb +111 -0
  43. data/lib/qrb/type/builtin_type.rb +56 -0
  44. data/lib/qrb/type/relation_type.rb +81 -0
  45. data/lib/qrb/type/seq_type.rb +51 -0
  46. data/lib/qrb/type/set_type.rb +52 -0
  47. data/lib/qrb/type/sub_type.rb +94 -0
  48. data/lib/qrb/type/tuple_type.rb +99 -0
  49. data/lib/qrb/type/union_type.rb +78 -0
  50. data/lib/qrb/type.rb +63 -0
  51. data/lib/qrb/version.rb +14 -0
  52. data/lib/qrb.rb +63 -0
  53. data/qrb.gemspec +186 -0
  54. data/spec/acceptance/Q/test_default.rb +96 -0
  55. data/spec/acceptance/Q/test_parsing.rb +15 -0
  56. data/spec/acceptance/ad_type/test_in_q.rb +82 -0
  57. data/spec/acceptance/ad_type/test_in_ruby.rb +60 -0
  58. data/spec/spec_helper.rb +68 -0
  59. data/spec/unit/attribute/test_equality.rb +26 -0
  60. data/spec/unit/attribute/test_fetch_on.rb +50 -0
  61. data/spec/unit/attribute/test_initialize.rb +13 -0
  62. data/spec/unit/attribute/test_to_name.rb +10 -0
  63. data/spec/unit/heading/test_each.rb +28 -0
  64. data/spec/unit/heading/test_equality.rb +28 -0
  65. data/spec/unit/heading/test_initialize.rb +36 -0
  66. data/spec/unit/heading/test_size.rb +30 -0
  67. data/spec/unit/heading/test_to_name.rb +32 -0
  68. data/spec/unit/qrb/test_parse.rb +18 -0
  69. data/spec/unit/syntax/nodes/test_ad_type.rb +94 -0
  70. data/spec/unit/syntax/nodes/test_attribute.rb +25 -0
  71. data/spec/unit/syntax/nodes/test_builtin_type.rb +32 -0
  72. data/spec/unit/syntax/nodes/test_comment.rb +26 -0
  73. data/spec/unit/syntax/nodes/test_constraint_def.rb +27 -0
  74. data/spec/unit/syntax/nodes/test_constraints.rb +51 -0
  75. data/spec/unit/syntax/nodes/test_contract.rb +62 -0
  76. data/spec/unit/syntax/nodes/test_expression.rb +43 -0
  77. data/spec/unit/syntax/nodes/test_heading.rb +41 -0
  78. data/spec/unit/syntax/nodes/test_named_constraint.rb +31 -0
  79. data/spec/unit/syntax/nodes/test_relation_type.rb +41 -0
  80. data/spec/unit/syntax/nodes/test_seq_type.rb +24 -0
  81. data/spec/unit/syntax/nodes/test_set_type.rb +24 -0
  82. data/spec/unit/syntax/nodes/test_spacing.rb +25 -0
  83. data/spec/unit/syntax/nodes/test_sub_type.rb +52 -0
  84. data/spec/unit/syntax/nodes/test_tuple_type.rb +41 -0
  85. data/spec/unit/syntax/nodes/test_union_type.rb +23 -0
  86. data/spec/unit/syntax/nodes/test_unnamed_constraint.rb +31 -0
  87. data/spec/unit/syntax/test_compile_type.rb +22 -0
  88. data/spec/unit/system/test_add_type.rb +47 -0
  89. data/spec/unit/system/test_dsl.rb +30 -0
  90. data/spec/unit/system/test_dup.rb +30 -0
  91. data/spec/unit/system/test_fetch.rb +42 -0
  92. data/spec/unit/system/test_get_type.rb +30 -0
  93. data/spec/unit/system/test_initialize.rb +10 -0
  94. data/spec/unit/test_qrb.rb +15 -0
  95. data/spec/unit/type/ad_type/test_default_name.rb +15 -0
  96. data/spec/unit/type/ad_type/test_dress.rb +55 -0
  97. data/spec/unit/type/ad_type/test_include.rb +22 -0
  98. data/spec/unit/type/ad_type/test_initialize.rb +40 -0
  99. data/spec/unit/type/ad_type/test_name.rb +20 -0
  100. data/spec/unit/type/builtin_type/test_default_name.rb +12 -0
  101. data/spec/unit/type/builtin_type/test_dress.rb +33 -0
  102. data/spec/unit/type/builtin_type/test_equality.rb +26 -0
  103. data/spec/unit/type/builtin_type/test_include.rb +22 -0
  104. data/spec/unit/type/builtin_type/test_initialize.rb +12 -0
  105. data/spec/unit/type/builtin_type/test_name.rb +24 -0
  106. data/spec/unit/type/relation_type/test_default_name.rb +16 -0
  107. data/spec/unit/type/relation_type/test_dress.rb +164 -0
  108. data/spec/unit/type/relation_type/test_equality.rb +32 -0
  109. data/spec/unit/type/relation_type/test_include.rb +46 -0
  110. data/spec/unit/type/relation_type/test_initialize.rb +26 -0
  111. data/spec/unit/type/relation_type/test_name.rb +24 -0
  112. data/spec/unit/type/seq_type/test_default_name.rb +14 -0
  113. data/spec/unit/type/seq_type/test_dress.rb +49 -0
  114. data/spec/unit/type/seq_type/test_equality.rb +26 -0
  115. data/spec/unit/type/seq_type/test_include.rb +43 -0
  116. data/spec/unit/type/seq_type/test_initialize.rb +28 -0
  117. data/spec/unit/type/seq_type/test_name.rb +24 -0
  118. data/spec/unit/type/set_type/test_default_name.rb +14 -0
  119. data/spec/unit/type/set_type/test_dress.rb +66 -0
  120. data/spec/unit/type/set_type/test_equality.rb +26 -0
  121. data/spec/unit/type/set_type/test_include.rb +43 -0
  122. data/spec/unit/type/set_type/test_initialize.rb +28 -0
  123. data/spec/unit/type/set_type/test_name.rb +24 -0
  124. data/spec/unit/type/sub_type/test_default_name.rb +14 -0
  125. data/spec/unit/type/sub_type/test_dress.rb +75 -0
  126. data/spec/unit/type/sub_type/test_equality.rb +34 -0
  127. data/spec/unit/type/sub_type/test_include.rb +34 -0
  128. data/spec/unit/type/sub_type/test_initialize.rb +16 -0
  129. data/spec/unit/type/sub_type/test_name.rb +24 -0
  130. data/spec/unit/type/tuple_type/test_default_name.rb +14 -0
  131. data/spec/unit/type/tuple_type/test_dress.rb +112 -0
  132. data/spec/unit/type/tuple_type/test_equality.rb +32 -0
  133. data/spec/unit/type/tuple_type/test_include.rb +38 -0
  134. data/spec/unit/type/tuple_type/test_initialize.rb +30 -0
  135. data/spec/unit/type/tuple_type/test_name.rb +24 -0
  136. data/spec/unit/type/union_type/test_default_name.rb +12 -0
  137. data/spec/unit/type/union_type/test_dress.rb +43 -0
  138. data/spec/unit/type/union_type/test_equality.rb +30 -0
  139. data/spec/unit/type/union_type/test_include.rb +28 -0
  140. data/spec/unit/type/union_type/test_initialize.rb +24 -0
  141. data/spec/unit/type/union_type/test_name.rb +20 -0
  142. data/spec/unit/type_factory/dsl/test_adt.rb +54 -0
  143. data/spec/unit/type_factory/dsl/test_attribute.rb +37 -0
  144. data/spec/unit/type_factory/dsl/test_attributes.rb +41 -0
  145. data/spec/unit/type_factory/dsl/test_builtin.rb +45 -0
  146. data/spec/unit/type_factory/dsl/test_relation.rb +85 -0
  147. data/spec/unit/type_factory/dsl/test_seq.rb +57 -0
  148. data/spec/unit/type_factory/dsl/test_set.rb +57 -0
  149. data/spec/unit/type_factory/dsl/test_subtype.rb +91 -0
  150. data/spec/unit/type_factory/dsl/test_tuple.rb +73 -0
  151. data/spec/unit/type_factory/dsl/test_union.rb +81 -0
  152. data/spec/unit/type_factory/factory/test_builtin.rb +24 -0
  153. data/spec/unit/type_factory/factory/test_seq_type.rb +44 -0
  154. data/spec/unit/type_factory/factory/test_set_type.rb +44 -0
  155. data/spec/unit/type_factory/factory/test_sub_type.rb +53 -0
  156. data/spec/unit/type_factory/factory/test_tuple_type.rb +43 -0
  157. data/tasks/gem.rake +73 -0
  158. data/tasks/test.rake +31 -0
  159. metadata +344 -0
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#adt" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ let(:contracts){
8
+ { rgb: [intType, Color.method(:rgb) ],
9
+ hex: [floatType, Color.method(:hex) ]}
10
+ }
11
+
12
+ shared_examples_for "The <Color> type" do
13
+
14
+ it{ should be_a(AdType) }
15
+
16
+ it 'should have the correct ruby type' do
17
+ subject.ruby_type.should be(Color)
18
+ end
19
+
20
+ it 'should have the two contracts' do
21
+ subject.contracts.keys.should eq([:rgb, :hex])
22
+ end
23
+ end
24
+
25
+ before do
26
+ subject
27
+ end
28
+
29
+ context 'when used with the standard signature' do
30
+ subject{
31
+ factory.adt(Color, contracts)
32
+ }
33
+
34
+ it_should_behave_like "The <Color> type"
35
+
36
+ it 'should have the correct name' do
37
+ subject.name.should eq("Color")
38
+ end
39
+ end
40
+
41
+ context 'when used with a name' do
42
+ subject{
43
+ factory.adt(Color, contracts, "MyColor")
44
+ }
45
+
46
+ it_should_behave_like "The <Color> type"
47
+
48
+ it 'should have the correct name' do
49
+ subject.name.should eq("MyColor")
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#attribute" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ shared_examples_for "The a:Integer attribute" do
8
+
9
+ it{ should be_a(Attribute) }
10
+
11
+ it 'should have the correct name' do
12
+ subject.name.should eq(:a)
13
+ end
14
+
15
+ it 'should have the correct type' do
16
+ subject.type.should eq(intType)
17
+ end
18
+ end
19
+
20
+ context 'when used with a ruby class' do
21
+ subject{
22
+ factory.attribute(:a, Integer)
23
+ }
24
+
25
+ it_should_behave_like "The a:Integer attribute"
26
+ end
27
+
28
+ context 'when used with a type' do
29
+ subject{
30
+ factory.attribute(:a, intType)
31
+ }
32
+
33
+ it_should_behave_like "The a:Integer attribute"
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#attributes" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ shared_examples_for "The a:Integer, b:Float attributes" do
8
+
9
+ it{ should be_a(Array) }
10
+
11
+ it 'should be the correct pair' do
12
+ subject.should eq([ Attribute.new(:a, intType), Attribute.new(:b, floatType) ])
13
+ end
14
+ end
15
+
16
+ context 'when used with ruby classes' do
17
+ subject{
18
+ factory.attributes(a: Integer, b: Float)
19
+ }
20
+
21
+ it_should_behave_like "The a:Integer, b:Float attributes"
22
+ end
23
+
24
+ context 'when used with types' do
25
+ subject{
26
+ factory.attributes(a: intType, b: floatType)
27
+ }
28
+
29
+ it_should_behave_like "The a:Integer, b:Float attributes"
30
+ end
31
+
32
+ context 'when used with a mix of both types' do
33
+ subject{
34
+ factory.attributes(a: Integer, b: floatType)
35
+ }
36
+
37
+ it_should_behave_like "The a:Integer, b:Float attributes"
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#builtin" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ shared_examples_for "The Integer builtin type" do
8
+
9
+ it{ should be_a(BuiltinType) }
10
+
11
+ it 'should have the correct ruby type' do
12
+ subject.ruby_type.should be(Integer)
13
+ end
14
+ end
15
+
16
+ before do
17
+ subject
18
+ end
19
+
20
+ context 'when used with a ruby class and no name' do
21
+ subject{
22
+ factory.builtin(Integer)
23
+ }
24
+
25
+ it_should_behave_like "The Integer builtin type"
26
+
27
+ it 'should have the correct name' do
28
+ subject.name.should eq("Integer")
29
+ end
30
+ end
31
+
32
+ context 'when used with a ruby class and a name' do
33
+ subject{
34
+ factory.builtin(Integer, "Int")
35
+ }
36
+
37
+ it_should_behave_like "The Integer builtin type"
38
+
39
+ it 'should have the correct name' do
40
+ subject.name.should eq("Int")
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#relation" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ let(:heading){
8
+ Heading.new([ Attribute.new(:a, intType) ])
9
+ }
10
+
11
+ shared_examples_for "The Relation[a: Int] type" do
12
+
13
+ it{ should be_a(RelationType) }
14
+
15
+ it 'should have the correct heading' do
16
+ subject.heading.should eq(heading)
17
+ end
18
+ end
19
+
20
+ before do
21
+ subject
22
+ end
23
+
24
+ context 'when used with the standard signature' do
25
+ subject{
26
+ factory.relation(heading, "MyRelation")
27
+ }
28
+
29
+ it_should_behave_like "The Relation[a: Int] type"
30
+
31
+ it 'should have the correct name' do
32
+ subject.name.should eq("MyRelation")
33
+ end
34
+ end
35
+
36
+ context 'when used with a tuple type' do
37
+ subject{
38
+ factory.relation(TupleType.new(heading), "MyRelation")
39
+ }
40
+
41
+ it_should_behave_like "The Relation[a: Int] type"
42
+
43
+ it 'should have the correct name' do
44
+ subject.name.should eq("MyRelation")
45
+ end
46
+ end
47
+
48
+ context 'when used with a hash and ruby classes' do
49
+ subject{
50
+ factory.relation(a: Integer)
51
+ }
52
+
53
+ it_should_behave_like "The Relation[a: Int] type"
54
+
55
+ it 'should have the correct name' do
56
+ subject.name.should eq("{{a: Integer}}")
57
+ end
58
+ end
59
+
60
+ context 'when used with a hash and a name' do
61
+ subject{
62
+ factory.relation({a: Integer}, "MyRelation")
63
+ }
64
+
65
+ it_should_behave_like "The Relation[a: Int] type"
66
+
67
+ it 'should have the correct name' do
68
+ subject.name.should eq("MyRelation")
69
+ end
70
+ end
71
+
72
+ context 'when used with a hash and types' do
73
+ subject{
74
+ factory.relation(a: intType)
75
+ }
76
+
77
+ it_should_behave_like "The Relation[a: Int] type"
78
+
79
+ it 'should have the correct name' do
80
+ subject.name.should eq("{{a: intType}}")
81
+ end
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#seq" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ shared_examples_for "The Seq[Int] type" do
8
+
9
+ it{ should be_a(SeqType) }
10
+
11
+ it 'should have the correct element type' do
12
+ subject.elm_type.should eq(intType)
13
+ end
14
+ end
15
+
16
+ before do
17
+ subject
18
+ end
19
+
20
+ context 'when used with a ruby class' do
21
+ subject{
22
+ factory.seq(Integer)
23
+ }
24
+
25
+ it_should_behave_like "The Seq[Int] type"
26
+
27
+ it 'should have the correct name' do
28
+ subject.name.should eq("[Integer]")
29
+ end
30
+ end
31
+
32
+ context 'when used with a type' do
33
+ subject{
34
+ factory.seq(intType)
35
+ }
36
+
37
+ it_should_behave_like "The Seq[Int] type"
38
+
39
+ it 'should have the correct name' do
40
+ subject.name.should eq("[intType]")
41
+ end
42
+ end
43
+
44
+ context 'when used with an explicit name' do
45
+ subject{
46
+ factory.seq(intType, "MySeq")
47
+ }
48
+
49
+ it_should_behave_like "The Seq[Int] type"
50
+
51
+ it 'should have the correct name' do
52
+ subject.name.should eq("MySeq")
53
+ end
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#set" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ shared_examples_for "The Set[Int] type" do
8
+
9
+ it{ should be_a(SetType) }
10
+
11
+ it 'should have the correct element type' do
12
+ subject.elm_type.should eq(intType)
13
+ end
14
+ end
15
+
16
+ before do
17
+ subject
18
+ end
19
+
20
+ context 'when used with a ruby class' do
21
+ subject{
22
+ factory.set(Integer)
23
+ }
24
+
25
+ it_should_behave_like "The Set[Int] type"
26
+
27
+ it 'should have the correct name' do
28
+ subject.name.should eq("{Integer}")
29
+ end
30
+ end
31
+
32
+ context 'when used with a type' do
33
+ subject{
34
+ factory.set(intType)
35
+ }
36
+
37
+ it_should_behave_like "The Set[Int] type"
38
+
39
+ it 'should have the correct name' do
40
+ subject.name.should eq("{intType}")
41
+ end
42
+ end
43
+
44
+ context 'when used with an explicit name' do
45
+ subject{
46
+ factory.set(intType, "MySet")
47
+ }
48
+
49
+ it_should_behave_like "The Set[Int] type"
50
+
51
+ it 'should have the correct name' do
52
+ subject.name.should eq("MySet")
53
+ end
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#subtype" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ let(:constraints){
8
+ { predicate: 1..10 }
9
+ }
10
+
11
+ shared_examples_for "The PosInt type" do
12
+
13
+ it{ should be_a(SubType) }
14
+
15
+ it 'should have the BuiltinType(Integer) super type' do
16
+ subject.super_type.should be_a(BuiltinType)
17
+ subject.super_type.ruby_type.should be(Integer)
18
+ end
19
+
20
+ it 'should have the correct constraint' do
21
+ ->{
22
+ subject.dress(-12)
23
+ }.should raise_error(TypeError)
24
+ end
25
+ end
26
+
27
+ shared_examples_for "The SmallInt structural type" do
28
+
29
+ it{ should be_a(SubType) }
30
+
31
+ it 'should have the BuiltinType(Integer) super type' do
32
+ subject.super_type.should be_a(BuiltinType)
33
+ subject.super_type.ruby_type.should be(Integer)
34
+ end
35
+
36
+ it 'should have the correct constraints' do
37
+ subject.constraints.should eq(constraints)
38
+ end
39
+ end
40
+
41
+ before do
42
+ subject
43
+ end
44
+
45
+ context 'when used with a type' do
46
+ subject{
47
+ supertype = BuiltinType.new(Integer)
48
+ factory.subtype(supertype, constraints)
49
+ }
50
+
51
+ it_should_behave_like "The SmallInt structural type"
52
+ end
53
+
54
+ context 'when used with a ruby class' do
55
+ subject{
56
+ factory.subtype(Integer, constraints)
57
+ }
58
+
59
+ it_should_behave_like "The SmallInt structural type"
60
+ end
61
+
62
+ context 'when used with a constraints shorthand' do
63
+ subject{
64
+ factory.subtype(Integer, 1..10)
65
+ }
66
+
67
+ it_should_behave_like "The SmallInt structural type"
68
+ end
69
+
70
+ context 'when used with a constraint block' do
71
+ subject{
72
+ factory.subtype(Integer){|i| i >=0 }
73
+ }
74
+
75
+ it_should_behave_like "The PosInt type"
76
+ end
77
+
78
+ context 'when used with a name' do
79
+ subject{
80
+ factory.subtype(Integer, constraints, "SmallInt")
81
+ }
82
+
83
+ it_should_behave_like "The SmallInt structural type"
84
+
85
+ it 'should have the correct name' do
86
+ subject.name.should eq("SmallInt")
87
+ end
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#tuple" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ let(:heading){
8
+ Heading.new([ Attribute.new(:a, intType) ])
9
+ }
10
+
11
+ shared_examples_for "The Tuple[a: Int] type" do
12
+
13
+ it{ should be_a(TupleType) }
14
+
15
+ it 'should have the correct heading' do
16
+ subject.heading.should eq(heading)
17
+ end
18
+ end
19
+
20
+ before do
21
+ subject
22
+ end
23
+
24
+ context 'when used with the standard signature' do
25
+ subject{
26
+ factory.tuple(heading, "MyTuple")
27
+ }
28
+
29
+ it_should_behave_like "The Tuple[a: Int] type"
30
+
31
+ it 'should have the correct name' do
32
+ subject.name.should eq("MyTuple")
33
+ end
34
+ end
35
+
36
+ context 'when used with a hash and ruby classes' do
37
+ subject{
38
+ factory.tuple(a: Integer)
39
+ }
40
+
41
+ it_should_behave_like "The Tuple[a: Int] type"
42
+
43
+ it 'should have the correct name' do
44
+ subject.name.should eq("{a: Integer}")
45
+ end
46
+ end
47
+
48
+ context 'when used with a hash and a name' do
49
+ subject{
50
+ factory.tuple({a: Integer}, "MyTuple")
51
+ }
52
+
53
+ it_should_behave_like "The Tuple[a: Int] type"
54
+
55
+ it 'should have the correct name' do
56
+ subject.name.should eq("MyTuple")
57
+ end
58
+ end
59
+
60
+ context 'when used with a hash and types' do
61
+ subject{
62
+ factory.tuple(a: intType)
63
+ }
64
+
65
+ it_should_behave_like "The Tuple[a: Int] type"
66
+
67
+ it 'should have the correct name' do
68
+ subject.name.should eq("{a: intType}")
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "DSL#union" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ shared_examples_for "The Int|Float union type" do
8
+
9
+ it{ should be_a(UnionType) }
10
+
11
+ it 'should have the correct candidates' do
12
+ subject.candidates.should eq([intType, floatType])
13
+ end
14
+ end
15
+
16
+ before do
17
+ subject
18
+ end
19
+
20
+ context 'when used with the standard signature' do
21
+ subject{
22
+ factory.union([Integer, Float], 'MyUnion')
23
+ }
24
+
25
+ it_should_behave_like "The Int|Float union type"
26
+
27
+ it 'should have the correct name' do
28
+ subject.name.should eq("MyUnion")
29
+ end
30
+ end
31
+
32
+ context 'when used with the standard signature and no name' do
33
+ subject{
34
+ factory.union([Integer, Float])
35
+ }
36
+
37
+ it_should_behave_like "The Int|Float union type"
38
+
39
+ it 'should have the correct name' do
40
+ subject.name.should eq("Integer|Float")
41
+ end
42
+ end
43
+
44
+ context 'when used with a list of ruby classes' do
45
+ subject{
46
+ factory.union(Integer, Float)
47
+ }
48
+
49
+ it_should_behave_like "The Int|Float union type"
50
+
51
+ it 'should have the correct name' do
52
+ subject.name.should eq("Integer|Float")
53
+ end
54
+ end
55
+
56
+ context 'when used with a list of types' do
57
+ subject{
58
+ factory.union(intType, floatType)
59
+ }
60
+
61
+ it_should_behave_like "The Int|Float union type"
62
+
63
+ it 'should have the correct name' do
64
+ subject.name.should eq("intType|floatType")
65
+ end
66
+ end
67
+
68
+ context 'when used with a mix of both' do
69
+ subject{
70
+ factory.union(Integer, floatType)
71
+ }
72
+
73
+ it_should_behave_like "The Int|Float union type"
74
+
75
+ it 'should have the correct name' do
76
+ subject.name.should eq("Integer|floatType")
77
+ end
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "Factory#builtin" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ context 'when use with a ruby class' do
8
+ subject{ factory.type(Integer) }
9
+
10
+ it{ should eq(intType) }
11
+ end
12
+
13
+ context 'when use with a ruby class and a name' do
14
+ subject{ factory.type(Integer, "Int") }
15
+
16
+ it{ should eq(intType) }
17
+
18
+ it 'should have the correct name' do
19
+ subject.name.should eq("Int")
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ module Qrb
3
+ describe TypeFactory, "Factory#seq" do
4
+
5
+ let(:factory){ TypeFactory.new }
6
+
7
+ context 'for sequences of scalars' do
8
+ let(:expected){ SeqType.new(intType) }
9
+
10
+ context 'when used with [Class]' do
11
+ subject{ factory.type([Integer]) }
12
+
13
+ it{ should eq(expected) }
14
+ end
15
+
16
+ context 'when used with [Class] and a name' do
17
+ subject{ factory.type([Integer], "MySeq") }
18
+
19
+ it{ should eq(expected) }
20
+
21
+ it 'should have the correct name' do
22
+ subject.name.should eq("MySeq")
23
+ end
24
+ end
25
+ end
26
+
27
+ context 'for pseudo-relations' do
28
+ subject{
29
+ factory.type([{r: Integer}], "MySeq")
30
+ }
31
+
32
+ let(:expected){
33
+ factory.seq(factory.tuple(r: Integer))
34
+ }
35
+
36
+ it{ should eq(expected) }
37
+
38
+ it 'should have the correct name' do
39
+ subject.name.should eq("MySeq")
40
+ end
41
+ end
42
+
43
+ end
44
+ end