open_ehr 0.9.4 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/History.txt +3 -0
  2. data/README.rdoc +3 -3
  3. data/VERSION +1 -1
  4. data/lib/open_ehr/am/archetype/constraint_model/primitive.rb +61 -34
  5. data/lib/open_ehr/am/openehr_profile/data_types/basic.rb +27 -0
  6. data/lib/open_ehr/am/openehr_profile/data_types/quantity.rb +18 -0
  7. data/lib/open_ehr/am/openehr_profile/data_types/text.rb +22 -0
  8. data/lib/open_ehr/am/openehr_profile/data_types.rb +12 -0
  9. data/lib/open_ehr/am/openehr_profile.rb +10 -0
  10. data/lib/open_ehr/am.rb +2 -0
  11. data/lib/open_ehr/assumed_library_types.rb +30 -25
  12. data/lib/open_ehr/parser/cadl_grammar.tt +479 -163
  13. data/lib/open_ehr/parser/shared_token_grammar.tt +63 -43
  14. data/lib/open_ehr/rm/data_types/quantity/date_time.rb +27 -14
  15. data/lib/open_ehr.rb +1 -1
  16. data/open_ehr.gemspec +17 -6
  17. data/spec/lib/open_ehr/am/archetype/assertion/operator_kind_spec.rb +4 -0
  18. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_date_spec.rb +20 -48
  19. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_date_time_spec.rb +33 -8
  20. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_duration_spec.rb +19 -52
  21. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_string_spec.rb +2 -3
  22. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_time_spec.rb +27 -7
  23. data/spec/lib/open_ehr/am/archetype/ontology/archetype_ontology_spec.rb +0 -1
  24. data/spec/lib/open_ehr/am/openehr_profile/data_types/text/c_code_phrase_spec.rb +35 -0
  25. data/spec/lib/open_ehr/parser/adl14/adl-test-SOME_TYPE.generic_type_basic.draft.adl +1 -1
  26. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_slot.test.adl +1 -1
  27. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_slot.test2.adl +1 -1
  28. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.basic_types.test.adl +3 -3
  29. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_code_phrase.test.adl +1 -1
  30. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.datetime.test.adl +1 -1
  31. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.durations.test.adl +2 -4
  32. data/spec/lib/open_ehr/parser/adl_archetype_internal_ref_with_generics_spec.rb +6 -6
  33. data/spec/lib/open_ehr/parser/adl_archetype_slot_cluster_spec.rb +101 -0
  34. data/spec/lib/open_ehr/parser/adl_archetype_slot_spec.rb +193 -0
  35. data/spec/lib/open_ehr/parser/adl_archetype_uncommon_term_keys_spec.rb +25 -0
  36. data/spec/lib/open_ehr/parser/adl_parser_spec.rb +6 -6
  37. data/spec/lib/open_ehr/parser/basic_generic_type_spec.rb +18 -0
  38. data/spec/lib/open_ehr/parser/basic_type_spec.rb +2922 -0
  39. data/spec/lib/open_ehr/parser/code_phrase_spec.rb +91 -0
  40. data/spec/lib/open_ehr/parser/date_time_spec.rb +1953 -0
  41. data/spec/lib/open_ehr/parser/duration_spec.rb +475 -0
  42. data/spec/lib/open_ehr/rm/data_types/quantity/date_time/dv_duration_spec.rb +44 -0
  43. data/spec/lib/open_ehr/rm/data_types/quantity/date_time/dv_time_spec.rb +6 -2
  44. data/spec/spec_helper.rb +3 -2
  45. metadata +52 -41
  46. data/lib/open_ehr/am/archetype/archetype_description/archetype_description.rb +0 -21
  47. data/lib/open_ehr/am/open_ehr_profile/data_types/basic.rb +0 -29
  48. data/lib/open_ehr/am/open_ehr_profile/data_types/quantity.rb +0 -19
  49. data/lib/open_ehr/am/open_ehr_profile/data_types/text.rb +0 -15
@@ -1,18 +1,17 @@
1
1
  require File.dirname(__FILE__) + '/../../../../../../spec_helper'
2
- include OpenEHR::AssumedLibraryTypes
3
2
  include OpenEHR::AM::Archetype
4
3
  include OpenEHR::AM::Archetype::ConstraintModel::Primitive
4
+ include OpenEHR::RM::DataTypes::Quantity::DateTime
5
5
 
6
6
  describe CDateTime do
7
7
  before(:each) do
8
- default_value = ISO8601DateTime.new('2010-01-25T01:23:45.1')
9
- assumed_value = ISO8601DateTime.new('2001-12-23T22:02:33.2')
10
- range = Interval.new(:lower => ISO8601DateTime.new('1995-04-19T01:01:22'),
11
- :upper => ISO8601DateTime.new('2022-12-31T23:55:59'))
8
+ default_value = DvDateTime.new(:value => '2010-01-25T01:23:45.1')
9
+ assumed_value = DvDateTime.new(:value => '2001-12-23T22:02:33.2')
10
+ range = Interval.new(:lower => DvDateTime.new(:value =>'1995-04-19T01:01:22'),
11
+ :upper => DvDateTime.new(:value => '2022-12-31T23:55:59'))
12
12
  @c_date_time =
13
13
  CDateTime.new(:default_value => default_value,
14
14
  :assumed_value => assumed_value,
15
- :type => 'Boolean',
16
15
  :range => range,
17
16
  :month_validity => ValidityKind::MANDATORY,
18
17
  :day_validity => ValidityKind::MANDATORY,
@@ -27,8 +26,8 @@ describe CDateTime do
27
26
  @c_date_time.should be_an_instance_of CDateTime
28
27
  end
29
28
 
30
- it 'type is DvDateTime' do
31
- @c_date_time.type.should == 'Boolean'
29
+ it 'type is ISO8601_DATE_TIME' do
30
+ @c_date_time.type.should == 'ISO8601_DATE_TIME'
32
31
  end
33
32
 
34
33
  it 'hour_validity should be assigned properly' do
@@ -41,6 +40,11 @@ describe CDateTime do
41
40
  }.should raise_error ArgumentError
42
41
  end
43
42
 
43
+ it 'range is properly assigned, lower value is 1995-04-19T01:01:22' do
44
+ @c_date_time.range.lower.value.should == '1995-04-19T01:01:22'
45
+ end
46
+
47
+
44
48
  it 'should not raise ArgumentError if hour_validity is DISALLOWED and minute_validity is DISALLOWED' do
45
49
  @c_date_time.second_validity = ValidityKind::DISALLOWED
46
50
  @c_date_time.minute_validity = ValidityKind::DISALLOWED
@@ -108,4 +112,25 @@ describe CDateTime do
108
112
  @c_date_time.day_validity = ValidityKind::OPTIONAL
109
113
  }.should_not raise_error ArgumentError
110
114
  end
115
+
116
+ describe 'pattern constraint' do
117
+ before(:all) do
118
+ @c_date_timep = CDateTime.new(:pattern => 'yyyy-mm-dd hh:mm:ss')
119
+ end
120
+
121
+ it 'pattern is yyyy-mm-dd hh:mm:ss' do
122
+ @c_date_timep.pattern.should == 'yyyy-mm-dd hh:mm:ss'
123
+ end
124
+ end
125
+
126
+ describe 'list constraint' do
127
+ before(:all) do
128
+ @c_date_timel = CDateTime.new(:list =>
129
+ [DvDateTime.new(:value => '2010-01-25T01:23:45.1')])
130
+ end
131
+
132
+ it 'first item of list is 2010-01-25T01:23:45.1' do
133
+ @c_date_timel.list[0].value.should == '2010-01-25T01:23:45.1'
134
+ end
135
+ end
111
136
  end
@@ -1,74 +1,41 @@
1
1
  require File.dirname(__FILE__) + '/../../../../../../spec_helper'
2
+ include OpenEHR::RM::DataTypes::Quantity::DateTime
2
3
  include OpenEHR::AssumedLibraryTypes
3
- include OpenEHR::AM::Archetype
4
4
  include OpenEHR::AM::Archetype::ConstraintModel::Primitive
5
5
 
6
6
  describe CDuration do
7
- before(:each) do
8
- assumed_value = stub(ISO8601Duration, :year => 2)
9
- default_value = stub(ISO8601Duration, :month => 3)
10
- range = stub(Interval, :upper => assumed_value, :lower => default_value)
7
+ before(:all) do
8
+ assumed_value = DvDuration.new(:value => 'P2Y')
9
+ default_value = DvDuration.new(:value => 'P3M')
10
+ range = Interval.new(:upper => assumed_value, :lower => default_value)
11
11
  @c_duration = CDuration.new(:assumed_value => assumed_value,
12
12
  :default_value => default_value,
13
- :type => 'Boolean',
14
- :range => range,
15
- :years_allowed => true,
16
- :months_allowed => false,
17
- :weeks_allowed => true,
18
- :days_allowed => false,
19
- :hours_allowed => true,
20
- :minutes_allowed => false,
21
- :seconds_allowed => true,
22
- :fractional_seconds_allowed => false)
13
+ :range => range)
23
14
  end
24
15
 
25
16
  it 'should be an instance of CDuration' do
26
17
  @c_duration.should be_an_instance_of CDuration
27
18
  end
28
19
 
29
- it 'type is DvDuration' do
30
- @c_duration.type.should == 'Boolean'
20
+ it 'type is ISO8601_DURATION' do
21
+ @c_duration.type.should == 'ISO8601_DURATION'
31
22
  end
32
23
 
33
- it 'years_allowed should be assigned properly' do
34
- @c_duration.years_allowed.should be_true
24
+ it 'upper range is 2 years' do
25
+ @c_duration.range.upper.value.should == 'P2Y'
35
26
  end
36
27
 
37
- it 'months_allowed should be assigned properly' do
38
- @c_duration.months_allowed.should be_false
28
+ it 'lower range is 3 months year' do
29
+ @c_duration.range.lower.value.should == 'P3M'
39
30
  end
40
31
 
41
- it 'weeks_allowed should be assigned properly' do
42
- @c_duration.weeks_allowed.should be_true
43
- end
44
-
45
- it 'days_allowed should be assigned properly' do
46
- @c_duration.days_allowed.should be_false
47
- end
48
-
49
- it 'hours_allowed should be assigned properly' do
50
- @c_duration.hours_allowed.should be_true
51
- end
52
-
53
- it 'minutes_allowed should be assigned properly' do
54
- @c_duration.minutes_allowed.should be_false
55
- end
56
-
57
- it 'seconds_allowed should be assigned properly' do
58
- @c_duration.seconds_allowed.should be_true
59
- end
60
-
61
- it 'fractional_seconds_allowed should be assigned properly' do
62
- @c_duration.fractional_seconds_allowed.should be_false
63
- end
32
+ context 'list constraint' do
33
+ before(:all) do
34
+ @c_duration = CDuration.new(:list => [DvDuration.new(:value => 'PT0s')])
35
+ end
64
36
 
65
- it 'should raise ArgumentError if range is nil and all parameters are not allowed' do
66
- @c_duration.years_allowed = false
67
- @c_duration.weeks_allowed = false
68
- @c_duration.hours_allowed = false
69
- @c_duration.seconds_allowed = false
70
- lambda {
71
- @c_duration.range = nil
72
- }.should raise_error ArgumentError
37
+ it '1st item of the list value is PT0s' do
38
+ @c_duration.list[0].value.should == 'PT0s'
39
+ end
73
40
  end
74
41
  end
@@ -6,7 +6,6 @@ describe CString do
6
6
  before(:each) do
7
7
  @default_value = DvText.new(:value => 'default')
8
8
  @c_string = CString.new(:default_value => @default_value,
9
- :type => 'Boolean',
10
9
  :assumed_value => 'assumed',
11
10
  :pattern => 't[a-z]st')
12
11
  end
@@ -15,8 +14,8 @@ describe CString do
15
14
  @c_string.should be_an_instance_of CString
16
15
  end
17
16
 
18
- it 'type is DvText' do
19
- @c_string.type.should == 'Boolean'
17
+ it 'type is always String' do
18
+ @c_string.type.should == 'String'
20
19
  end
21
20
 
22
21
  it 'default should be assigned properly' do
@@ -1,17 +1,16 @@
1
1
  require File.dirname(__FILE__) + '/../../../../../../spec_helper'
2
- include OpenEHR::AssumedLibraryTypes
2
+ include OpenEHR::RM::DataTypes::Quantity::DateTime
3
3
  include OpenEHR::AM::Archetype
4
4
  include OpenEHR::AM::Archetype::ConstraintModel::Primitive
5
5
 
6
6
  describe CTime do
7
7
  before(:each) do
8
- default_value = ISO8601Time.new('01:23:45')
9
- assumed_value = ISO8601Time.new('22:02:33')
10
- range = Interval.new(:lower => ISO8601Time.new('01:01:22'),
11
- :upper => ISO8601Time.new('23:55:59'))
8
+ default_value = DvTime.new(:value => '01:23:45')
9
+ assumed_value = DvTime.new(:value => '22:02:33')
10
+ range = Interval.new(:lower => DvTime.new(:value => '01:01:22'),
11
+ :upper => DvTime.new(:value => '23:55:59'))
12
12
  @c_time = CTime.new(:default_value => default_value,
13
13
  :assumed_value => assumed_value,
14
- :type => 'Boolean',
15
14
  :range => range,
16
15
  :minute_validity => ValidityKind::MANDATORY,
17
16
  :second_validity => ValidityKind::OPTIONAL,
@@ -23,7 +22,7 @@ describe CTime do
23
22
  end
24
23
 
25
24
  it 'type is DvTime' do
26
- @c_time.type.should == 'Boolean'
25
+ @c_time.type.should == 'ISO8601_TIME'
27
26
  end
28
27
 
29
28
  it 'minute_validity should be assigned' do
@@ -81,4 +80,25 @@ describe CTime do
81
80
  @c_time.second_validity = ValidityKind::DISALLOWED
82
81
  }.should raise_error ArgumentError
83
82
  end
83
+
84
+ describe 'pattern constraint' do
85
+ before(:all) do
86
+ @c_timep = CTime.new(:pattern => 'hh:mm:ss')
87
+ end
88
+
89
+ it 'pattern is hh:mm:ss' do
90
+ @c_timep.pattern.should == 'hh:mm:ss'
91
+ end
92
+ end
93
+
94
+ describe 'list constraint' do
95
+ before(:all) do
96
+ time = DvTime.new(:value => '09:51:17')
97
+ @c_timel = CTime.new(:list => [time])
98
+ end
99
+
100
+ it 'first item value is 09:51:17' do
101
+ @c_timel.list[0].value.should == '09:51:17'
102
+ end
103
+ end
84
104
  end
@@ -42,7 +42,6 @@ describe ArchetypeOntology do
42
42
  @archetype_ontology.languages_available.should == ['ja', 'en']
43
43
  end
44
44
 
45
-
46
45
  it 'term_definition should be assigned properly' do
47
46
  @archetype_ontology.term_definition(:lang => 'ja', :code => 'at0000').items['text'].should == 'Archetype Concept'
48
47
  end
@@ -0,0 +1,35 @@
1
+ require File.dirname(__FILE__) + '/../../../../../../spec_helper'
2
+
3
+ include ::OpenEHR::RM::DataTypes::Text
4
+ include ::OpenEHR::AssumedLibraryTypes
5
+ include ::OpenEHR::RM::Support::Identification
6
+ require 'open_ehr/am/openehr_profile/data_types/text'
7
+ include ::OpenEHR::AM::OpenEHRProfile::DataTypes::Text
8
+
9
+ describe CCodePhrase do
10
+ before(:all) do
11
+ term_id = TerminologyID.new(:value => 'ICD10')
12
+ occurrences = Interval.new(:upper => 1)
13
+ @c_code_phrase = CCodePhrase.new(:terminology_id => term_id,
14
+ :code_list => ['C92', 'C93'],
15
+ :path => 'value/text',
16
+ :occurrences => occurrences,
17
+ :rm_type_name => 'CodePhrase')
18
+ end
19
+
20
+ it 'is an instance of CCodePhrase' do
21
+ @c_code_phrase.should be_an_instance_of CCodePhrase
22
+ end
23
+
24
+ it 'terminology_id is ICD10' do
25
+ @c_code_phrase.terminology_id.value.should == 'ICD10'
26
+ end
27
+
28
+ it 'code_list is C92, C93' do
29
+ @c_code_phrase.code_list.should == ['C92', 'C93']
30
+ end
31
+
32
+ it 'occurrences upper is 1' do
33
+ @c_code_phrase.occurrences.upper.should be 1
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  archetype (adl_version=1.4)
2
- adl-test-SOME_TYPE.generic_type_basic.draft
2
+ adl-test-SOME_TYPE.generic_type_basic.v1
3
3
 
4
4
  concept
5
5
  [at0000] -- root item
@@ -1,5 +1,5 @@
1
1
  archetype
2
- adl-test-entry.archetype_slot.test
2
+ adl-test-entry.archetype_slot.v1
3
3
 
4
4
  concept
5
5
  [at0000]
@@ -1,5 +1,5 @@
1
1
  archetype
2
- adl-test-entry.archetype_slot.test
2
+ adl-test-entry.archetype_slot.v1
3
3
 
4
4
  concept
5
5
  [at0000]
@@ -1,5 +1,5 @@
1
- archetype
2
- adl-test-ENTRY.test.draft
1
+ archetype
2
+ adl-test-ENTRY.basic_types.v1
3
3
 
4
4
  concept
5
5
  [at0000] -- basic data types test 1
@@ -115,7 +115,7 @@ definition
115
115
  date_attr10 matches {|> 2004-09-20|}
116
116
  date_attr11 matches {|>= 2004-09-20|}
117
117
 
118
- -- date_attr12 matches {2001-12-25, ...} -- Not currently in ADL syntax
118
+ date_attr12 matches {2001-12-25, ...} -- Not currently in ADL syntax
119
119
 
120
120
  -- with assumed values
121
121
  date_attr13 matches {yyyy-mm-dd; 2000-01-01}
@@ -1,5 +1,5 @@
1
1
  archetype
2
- adl-test-ENTRY.c_code_phrase.test
2
+ adl-test-ENTRY.c_code_phrase.v1
3
3
 
4
4
  concept
5
5
  [at0000]
@@ -1,5 +1,5 @@
1
1
  archetype
2
- adl-test-ENTRY.test.draft
2
+ adl-test-ENTRY.test.v1
3
3
 
4
4
  concept
5
5
  [at0000] -- basic data types test 1
@@ -1,5 +1,5 @@
1
1
  archetype
2
- adl-test-ENTRY.test.draft
2
+ adl-test-ENTRY.test.v1
3
3
 
4
4
  concept
5
5
  [at0000] -- basic data types test 1
@@ -54,9 +54,6 @@ definition
54
54
  ELEMENT[at1013] matches { -- duration with fractional seconds
55
55
  value matches {|PT1.1s|}
56
56
  }
57
- ELEMENT[at1014] matches { -- duration with mixed Pattern and Interval
58
- value matches {PTS/|PT0S..PT120S|}
59
- }
60
57
  -- matches {PT30s, PT45s, PT1m0s, PT2m0s} -- Not currently in ADL syntax
61
58
  -- matches {|P1d +/PT4h|}
62
59
  }
@@ -80,6 +77,7 @@ definition
80
77
  value matches {|<=PT1h|; P1d}
81
78
  }
82
79
  ELEMENT[at1006] matches { -- duration
80
+
83
81
  value matches {PDTH; P1d}
84
82
  }
85
83
 
@@ -97,15 +97,15 @@ describe ADLParser do
97
97
  end
98
98
 
99
99
  it 's lower is 37.0' do
100
- @magnitude.children[0].lower.should == 37.0
100
+ @magnitude.children[0].range.lower.should == 37.0
101
101
  end
102
102
 
103
103
  it 'is lower included' do
104
- @magnitude.children[0].should be_lower_included
104
+ @magnitude.children[0].range.should be_lower_included
105
105
  end
106
106
 
107
107
  it 'is upper unbounded' do
108
- @magnitude.children[0].should be_upper_unbounded
108
+ @magnitude.children[0].range.should be_upper_unbounded
109
109
  end
110
110
  end
111
111
  end
@@ -177,15 +177,15 @@ describe ADLParser do
177
177
  end
178
178
 
179
179
  it 's magnitude lower is 39.0' do
180
- @magnitude.children[0].lower.should == 39.0
180
+ @magnitude.children[0].range.lower.should == 39.0
181
181
  end
182
182
 
183
183
  it 's magnitude lower included' do
184
- @magnitude.children[0].should be_lower_included
184
+ @magnitude.children[0].range.should be_lower_included
185
185
  end
186
186
 
187
187
  it 's upper unbounded' do
188
- @magnitude.children[0].should be_upper_unbounded
188
+ @magnitude.children[0].range.should be_upper_unbounded
189
189
  end
190
190
  end
191
191
  end
@@ -0,0 +1,101 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+ require File.dirname(__FILE__) + '/parser_spec_helper'
3
+ include OpenEHR::AM::Archetype::ConstraintModel
4
+ include OpenEHR::AM::Archetype::ConstraintModel::Primitive
5
+ include OpenEHR::AM::Archetype::Assertion
6
+
7
+ # ticket 166
8
+
9
+ describe ADLParser do
10
+ context ArchetypeSlot do
11
+ before(:all) do
12
+ archetype = adl14_archetype('adl-test-entry.archetype_slot.test2.adl')
13
+ @slot = archetype.definition.attributes[0].children[0]
14
+ end
15
+
16
+ it 'is an instance of ArchetypeSlot' do
17
+ @slot.should be_an_instance_of ArchetypeSlot
18
+ end
19
+
20
+ it 's node id is at0001' do
21
+ @slot.node_id.should == 'at0001'
22
+ end
23
+
24
+ it 's occurrences upper is 1' do
25
+ @slot.occurrences.upper.should be 1
26
+ end
27
+
28
+ it 's occurrences lower is 0' do
29
+ @slot.occurrences.lower.should be 0
30
+ end
31
+
32
+ it 's rm type name is SECTION' do
33
+ @slot.rm_type_name.should == 'SECTION'
34
+ end
35
+
36
+ it 's path is /content[at0001]' do
37
+ @slot.path.should == '/content[at0001]'
38
+ end
39
+
40
+ context 'includes' do
41
+ before(:all) do
42
+ @includes = @slot.includes
43
+ end
44
+
45
+ it 's size is 1' do
46
+ @includes.size.should be 1
47
+ end
48
+
49
+ it 's string_expression is archetype_id/value matches {/openEHR-EHR-CLUSTER\.device\.v1/}' do
50
+ @includes[0].string_expression.should ==
51
+ 'archetype_id/value matches {/openEHR-EHR-CLUSTER\.device\.v1/}'
52
+ end
53
+
54
+ context 'item' do
55
+ before(:all) do
56
+ @item = @includes[0].expression
57
+ end
58
+
59
+ it 'is an instance of ExprBooleanExpression' do
60
+ @item.should be_an_instance_of ExprBinaryOperator
61
+ end
62
+
63
+ it 's operator is OP_MATCHES' do
64
+ @item.operator.should == OperatorKind::OP_MATCHES
65
+ end
66
+
67
+ context 'left operand' do
68
+ before(:all) do
69
+ @left_operand = @item.left_operand
70
+ end
71
+
72
+ it 'is an instance of ExprLeaf' do
73
+ @left_operand.should be_an_instance_of ExprLeaf
74
+ end
75
+
76
+ it 's item is archetype_id/value' do
77
+ @left_operand.item.should == 'archetype_id/value'
78
+ end
79
+ end
80
+
81
+ context 'right operand' do
82
+ before(:all) do
83
+ @right_operand = @item.right_operand
84
+ end
85
+
86
+ it 'is an intance of ExprLeaf' do
87
+ @right_operand.should be_an_instance_of ExprLeaf
88
+ end
89
+
90
+ it 's item type is CString' do
91
+ @right_operand.item.should be_an_instance_of CString
92
+ end
93
+
94
+ it 's item pattern is /openEHR-EHR-CLUSTER\.device\.v1/' do
95
+ @right_operand.item.pattern.should == '/openEHR-EHR-CLUSTER\.device\.v1/'
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end