dcm_dict 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +674 -0
  3. data/LICENSE +22 -0
  4. data/README.md +296 -0
  5. data/Rakefile +36 -0
  6. data/bin/dcm_dict_converter.rb +194 -0
  7. data/lib/dcm_dict.rb +46 -0
  8. data/lib/dcm_dict/dictionary/base_dictionary.rb +47 -0
  9. data/lib/dcm_dict/dictionary/base_record.rb +62 -0
  10. data/lib/dcm_dict/dictionary/data_element_dictionary.rb +117 -0
  11. data/lib/dcm_dict/dictionary/data_element_record.rb +93 -0
  12. data/lib/dcm_dict/dictionary/uid_dictionary.rb +82 -0
  13. data/lib/dcm_dict/dictionary/uid_record.rb +48 -0
  14. data/lib/dcm_dict/encoder/data_to_code.rb +79 -0
  15. data/lib/dcm_dict/error/dictionary_error.rb +30 -0
  16. data/lib/dcm_dict/ext/object_extension.rb +38 -0
  17. data/lib/dcm_dict/refine/array_refine.rb +34 -0
  18. data/lib/dcm_dict/refine/data_element_refine.rb +37 -0
  19. data/lib/dcm_dict/refine/internal/array_refine_internal.rb +97 -0
  20. data/lib/dcm_dict/refine/internal/hash_refine_internal.rb +71 -0
  21. data/lib/dcm_dict/refine/internal/string_refine_internal.rb +119 -0
  22. data/lib/dcm_dict/refine/string_refine.rb +35 -0
  23. data/lib/dcm_dict/refine/symbol_refine.rb +34 -0
  24. data/lib/dcm_dict/refine/uid_refine.rb +36 -0
  25. data/lib/dcm_dict/rubies/rb_ext.rb +32 -0
  26. data/lib/dcm_dict/source_data/data_elements_data.rb +3937 -0
  27. data/lib/dcm_dict/source_data/detached_data.rb +67 -0
  28. data/lib/dcm_dict/source_data/uid_values_data.rb +382 -0
  29. data/lib/dcm_dict/version.rb +27 -0
  30. data/lib/dcm_dict/xml/constant.rb +38 -0
  31. data/lib/dcm_dict/xml/field_data.rb +47 -0
  32. data/lib/dcm_dict/xml/nokogiri_tool.rb +108 -0
  33. data/lib/dcm_dict/xml/rexml_tool.rb +105 -0
  34. data/lib/dcm_dict/xml/tag_field_data.rb +96 -0
  35. data/lib/dcm_dict/xml/uid_field_data.rb +49 -0
  36. data/lib/dcm_dict/xml/xml_tool.rb +47 -0
  37. data/spec/data_element_sample_spec_helper.rb +110 -0
  38. data/spec/data_element_shared_example_spec_helper.rb +57 -0
  39. data/spec/dcm_dict/dictionary/data_element_dictionary_spec.rb +75 -0
  40. data/spec/dcm_dict/dictionary/data_element_record_spec.rb +117 -0
  41. data/spec/dcm_dict/dictionary/uid_dictionary_spec.rb +60 -0
  42. data/spec/dcm_dict/dictionary/uid_record_spec.rb +53 -0
  43. data/spec/dcm_dict/encoder/data_to_code_spec.rb +109 -0
  44. data/spec/dcm_dict/ext/object_extension_spec.rb +53 -0
  45. data/spec/dcm_dict/refine/array_refine_spec.rb +61 -0
  46. data/spec/dcm_dict/refine/internal/array_refine_internal_spec.rb +98 -0
  47. data/spec/dcm_dict/refine/internal/hash_refine_internal_spec.rb +64 -0
  48. data/spec/dcm_dict/refine/internal/string_refine_internal_spec.rb +214 -0
  49. data/spec/dcm_dict/refine/string_refine_spec.rb +87 -0
  50. data/spec/dcm_dict/refine/symbol_refine_spec.rb +41 -0
  51. data/spec/dcm_dict/rubies/rb_ext_spec.rb +46 -0
  52. data/spec/dcm_dict/source_data/data_elements_data_spec.rb +40 -0
  53. data/spec/dcm_dict/source_data/detached_data_spec.rb +55 -0
  54. data/spec/dcm_dict/source_data/uid_values_data_spec.rb +37 -0
  55. data/spec/dcm_dict/version_spec.rb +30 -0
  56. data/spec/dcm_dict/xml/tag_field_data_spec.rb +62 -0
  57. data/spec/dcm_dict/xml/uid_field_data_spec.rb +60 -0
  58. data/spec/dictionary_shared_example_spec_helper.rb +118 -0
  59. data/spec/refine_shared_example_spec_helper.rb +54 -0
  60. data/spec/spec_helper.rb +42 -0
  61. data/spec/xml_sample_spec_helper.rb +533 -0
  62. metadata +212 -0
@@ -0,0 +1,47 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ #require_relative 'constant'
25
+ require_relative 'rexml_tool'
26
+ require_relative 'nokogiri_tool'
27
+
28
+ module DcmDict
29
+ module XML
30
+
31
+ # Main tool to handle xml data for uid and data element
32
+ module XmlTool
33
+ class << self
34
+ private
35
+ def xml_tool
36
+ XML.nokogiri_enable? ? NokogiriTool : RexmlTool
37
+ end
38
+
39
+ def method_missing(*args, &block)
40
+ m = args.shift
41
+ xml_tool.send(m, *args, &block)
42
+ end
43
+ end
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,110 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ require 'spec_helper'
25
+ module DataElementSampleSpecHelper
26
+ def self.private_creator_sample
27
+ {
28
+ [17,5] => {tag_ps: '(0011,0005)', tag_str: '(0011,0005)', tag_ary: [0x0011,0x0005],
29
+ tag_sym: :private_creator, tag_ndm: '00110005', tag_name: 'Private Creator',
30
+ tag_key: 'PrivateCreator', tag_vr: [:LO], tag_vm: ['1'], tag_note: 'Dummy Record',
31
+ tag_multiple: false},
32
+ '(0011,0005)' => {tag_ps: '(0011,0005)', tag_str: '(0011,0005)', tag_ary: [0x0011,0x0005],
33
+ tag_sym: :private_creator, tag_ndm: '00110005', tag_name: 'Private Creator',
34
+ tag_key: 'PrivateCreator', tag_vr: [:LO], tag_vm: ['1'], tag_note: 'Dummy Record',
35
+ tag_multiple: false},
36
+ '00110005' => {tag_ps: '(0011,0005)', tag_str: '(0011,0005)', tag_ary: [0x0011,0x0005],
37
+ tag_sym: :private_creator, tag_ndm: '00110005', tag_name: 'Private Creator',
38
+ tag_key: 'PrivateCreator', tag_vr: [:LO], tag_vm: ['1'], tag_note: 'Dummy Record',
39
+ tag_multiple: false}
40
+ }
41
+ end
42
+
43
+ def self.unknown_sample
44
+ {
45
+ [17,512] => {tag_ps: '(0011,0200)', tag_str: '(0011,0200)', tag_ary: [0x0011,0x0200],
46
+ tag_sym: :unknown_tag, tag_ndm: '00110200', tag_name: 'Unknown Tag',
47
+ tag_key: 'UnknownTag', tag_vr: [:UN], tag_vm: ['1'], tag_note: 'Dummy Record', tag_multiple: false},
48
+ [0x4444,0x1234] => {tag_ps: '(4444,1234)', tag_str: '(4444,1234)', tag_ary: [0x4444,0x1234],
49
+ tag_sym: :unknown_tag, tag_ndm: '44441234', tag_name: 'Unknown Tag',
50
+ tag_key: 'UnknownTag', tag_vr: [:UN], tag_vm: ['1'], tag_note: 'Dummy Record', tag_multiple: false},
51
+ '(4444,1234)' => {tag_ps: '(4444,1234)', tag_str: '(4444,1234)', tag_ary: [0x4444,0x1234],
52
+ tag_sym: :unknown_tag, tag_ndm: '44441234', tag_name: 'Unknown Tag',
53
+ tag_key: 'UnknownTag', tag_vr: [:UN], tag_vm: ['1'], tag_note: 'Dummy Record', tag_multiple: false},
54
+ '44441234' => {tag_ps: '(4444,1234)', tag_str: '(4444,1234)', tag_ary: [0x4444,0x1234],
55
+ tag_sym: :unknown_tag, tag_ndm: '44441234', tag_name: 'Unknown Tag',
56
+ tag_key: 'UnknownTag', tag_vr: [:UN], tag_vm: ['1'], tag_note: 'Dummy Record', tag_multiple: false},
57
+ }
58
+ end
59
+
60
+ def self.known_group_length_sample
61
+ {
62
+ [0,0] => { tag_ps: '(0000,0000)', tag_name: "Command Group Length", tag_key: 'CommandGroupLength',
63
+ tag_vr: [:UL], tag_vm: ["1"], tag_str: '(0000,0000)', tag_sym: :command_group_length,
64
+ tag_ndm: '00000000', tag_ary: [0, 0], tag_multiple: false,
65
+ tag_note: 'The even number of bytes from the end of the value field to the beginning of the next group.'}
66
+ }
67
+ end
68
+
69
+ def self.unknown_group_length_sample
70
+ {
71
+ [16,0] => {tag_ps: '(0010,0000)', tag_str: '(0010,0000)', tag_ary: [0x0010,0x0000],
72
+ tag_sym: :group_length, tag_ndm: '00100000', tag_name: 'Group Length',
73
+ tag_key: 'GroupLength', tag_vr: [:UL], tag_vm: ['1'], tag_note: 'Dummy Record',
74
+ tag_multiple: false},
75
+ [17,0] => {tag_ps: '(0011,0000)', tag_str: '(0011,0000)', tag_ary: [0x0011,0x0000],
76
+ tag_sym: :group_length, tag_ndm: '00110000', tag_name: 'Group Length',
77
+ tag_key: 'GroupLength', tag_vr: [:UL], tag_vm: ['1'], tag_note: 'Dummy Record',},
78
+ [0x4444,0x0000] => {tag_ps: '(4444,0000)', tag_str: '(4444,0000)', tag_ary: [0x4444,0x0000],
79
+ tag_sym: :group_length, tag_ndm: '44440000', tag_name: 'Group Length',
80
+ tag_key: 'GroupLength', tag_vr: [:UL], tag_vm: ['1'], tag_note: 'Dummy Record',
81
+ tag_multiple: false},
82
+ '44440000' => {tag_ps: '(4444,0000)', tag_str: '(4444,0000)', tag_ary: [0x4444,0x0000],
83
+ tag_sym: :group_length, tag_ndm: '44440000', tag_name: 'Group Length',
84
+ tag_key: 'GroupLength', tag_vr: [:UL], tag_vm: ['1'], tag_note: 'Dummy Record',
85
+ tag_multiple: false},
86
+ '(4444,0000)' => {tag_ps: '(4444,0000)', tag_str: '(4444,0000)', tag_ary: [0x4444,0x0000],
87
+ tag_sym: :group_length, tag_ndm: '44440000', tag_name: 'Group Length',
88
+ tag_key: 'GroupLength', tag_vr: [:UL], tag_vm: ['1'], tag_note: 'Dummy Record',
89
+ tag_multiple: false}
90
+
91
+ }
92
+ end
93
+
94
+ def self.multiple_tag_sample
95
+ {
96
+ # (60xx,0010) -> "Overlay Rows"
97
+ [0x60A2,0x0010] => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(60A2,0010)', tag_sym: :overlay_rows, tag_ndm: '60A20010', tag_ary: [0x60a2,0x0010], tag_multiple: true, tag_note: ''},
98
+ '60A20010' => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(60A2,0010)', tag_sym: :overlay_rows, tag_ndm: '60A20010', tag_ary: [0x60a2,0x0010], tag_multiple: true, tag_note: ''},
99
+ '(60A2,0010)' => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(60A2,0010)', tag_sym: :overlay_rows, tag_ndm: '60A20010', tag_ary: [0x60a2,0x0010], tag_multiple: true, tag_note: ''},
100
+ '(6022,0010)' => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(6022,0010)', tag_sym: :overlay_rows, tag_ndm: '60220010', tag_ary: [24610, 16], tag_multiple: true, tag_note: ''},
101
+ 'OverlayRows' => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(6022,0010)', tag_sym: :overlay_rows, tag_ndm: '60220010', tag_ary: [24610, 16], tag_multiple: true, tag_note: ''},
102
+ [0x6022,0x0010] => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(6022,0010)', tag_sym: :overlay_rows, tag_ndm: '60220010', tag_ary: [24610, 16], tag_multiple: true, tag_note: ''},
103
+ [0x1010,0xa1b2] => { tag_ps: '(1010,XXXX)', tag_name: "Zonal Map", tag_key: 'ZonalMap', tag_vr: [:US], tag_vm: ["1-n"], tag_str: '(1010,A1B2)', tag_sym: :zonal_map, tag_ndm: '1010A1B2', tag_ary: [0x1010, 0xa1b2], tag_multiple: true, tag_note: 'RET'},
104
+ '(1010,A1B2)' => { tag_ps: '(1010,XXXX)', tag_name: "Zonal Map", tag_key: 'ZonalMap', tag_vr: [:US], tag_vm: ["1-n"], tag_str: '(1010,A1B2)', tag_sym: :zonal_map, tag_ndm: '1010A1B2', tag_ary: [0x1010, 0xa1b2], tag_multiple: true, tag_note: 'RET'},
105
+ '1010A1B2' => { tag_ps: '(1010,XXXX)', tag_name: "Zonal Map", tag_key: 'ZonalMap', tag_vr: [:US], tag_vm: ["1-n"], tag_str: '(1010,A1B2)', tag_sym: :zonal_map, tag_ndm: '1010A1B2', tag_ary: [0x1010, 0xa1b2], tag_multiple: true, tag_note: 'RET'},
106
+ '10100000' => { tag_ps: '(1010,0000)', tag_name: 'Group Length', tag_key: 'GroupLength', tag_vr: [:UL], tag_vm: ["1"], tag_str: '(1010,0000)', tag_sym: :group_length, tag_ndm: '10100000', tag_ary: [0x1010, 0x0000], tag_multiple: false, tag_note: 'Dummy Record'},
107
+ }
108
+ end
109
+
110
+ end
@@ -0,0 +1,57 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ using DcmDict::Refine::ArrayRefine
25
+ using DcmDict::Refine::StringRefine
26
+ using DcmDict::Refine::SymbolRefine
27
+
28
+ RSpec.shared_examples "refinement for standard tag" do |tags, tag_proc|
29
+ describe "for standard tag" do
30
+ tags.each do |tag|
31
+ describe "as #{tag_proc.call(tag)}" do
32
+ obj = DcmDict::Dictionary::TheDataElementDictionary.record_at(tag)
33
+ DcmDict::Dictionary::DataElementMethod.each do |method|
34
+ expr = "#{tag_proc.call(tag)}.#{method.to_s}"
35
+ it "with #{expr} > #{obj.send(method).inspect}" do
36
+ value = eval(expr)
37
+ expect(value).to eq(obj.send(method))
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ RSpec.shared_examples "refinement for multiple tag" do |tag_data, tag_proc|
46
+ describe "for multiple tag" do
47
+ tag_data.each do |tag, data|
48
+ data.each do |key, exp_value|
49
+ expr = "#{tag_proc.call(tag)}.#{key}"
50
+ it "as #{expr} > #{exp_value.inspect}" do
51
+ value = eval(expr)
52
+ expect(value).to eq(exp_value)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,75 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ require 'spec_helper'
25
+ require 'data_element_sample_spec_helper'
26
+
27
+ describe DcmDict::Dictionary::DataElementDictionary do
28
+
29
+ include_examples "Map all source data",
30
+ [:tag_ps, :tag_name, :tag_key, :tag_str, :tag_sym, :tag_ndm, :tag_ary],
31
+ DcmDict::SourceData::DataElementsData,
32
+ DcmDict::Dictionary::TheDataElementDictionary,
33
+ DcmDict::Dictionary::DataElementRecord,
34
+ [:tag_ps, :tag_name, :tag_key, :tag_vr, :tag_vm, :tag_str, :tag_sym,
35
+ :tag_ndm, :tag_ary, :tag_multiple, :tag_note]
36
+
37
+ DataElementSampleSpecHelper.unknown_group_length_sample.
38
+ merge(DataElementSampleSpecHelper.known_group_length_sample).
39
+ merge(DataElementSampleSpecHelper.private_creator_sample).
40
+ merge(DataElementSampleSpecHelper.unknown_sample).each do |tag, data|
41
+ include_examples "Handle specific record", "single tag",
42
+ tag, data, DcmDict::Dictionary::TheDataElementDictionary
43
+ end
44
+
45
+ DataElementSampleSpecHelper.multiple_tag_sample.each do |tag, data|
46
+ include_examples "Handle specific record", "multiple tag",
47
+ tag, data, DcmDict::Dictionary::TheDataElementDictionary
48
+ end
49
+
50
+ [nil,
51
+ 123455,
52
+ 'abracadabra',
53
+ Time.now,
54
+ [1234.5678, 1234]
55
+ ].each do |wrong_tag|
56
+ include_examples "Dictionary with wrong key",
57
+ wrong_tag,
58
+ [:tag_ps, :tag_name, :tag_key, :tag_vr, :tag_vm, :tag_str,
59
+ :tag_sym, :tag_ndm, :tag_ary, :tag_multiple, :tag_note],
60
+ DcmDict::Dictionary::TheDataElementDictionary
61
+ end
62
+
63
+ include_examples "Dictionary Data not modifiable",
64
+ '(0002,0010)', :tag_ps, DcmDict::Dictionary::TheDataElementDictionary
65
+
66
+ include_examples "Concurrency support",
67
+ '(0002,0010)',
68
+ DcmDict::Dictionary::TheDataElementDictionary,
69
+ { tag_ps: '(0002,0010)', tag_name: "Transfer Syntax UID",
70
+ tag_key: 'TransferSyntaxUID', tag_vr: [:UI], tag_vm: ["1"],
71
+ tag_str: '(0002,0010)', tag_sym: :transfer_syntax_uid,
72
+ tag_ndm: '00020010', tag_ary: [0x0002,0x0010],
73
+ tag_multiple: false, tag_note: ''}
74
+
75
+ end
@@ -0,0 +1,117 @@
1
+ #
2
+ # Copyright (C) 2014 Enrico Rivarola
3
+ #
4
+ # This file is part of DcmDict gem (dcm_dict).
5
+ #
6
+ # DcmDict is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DcmDict is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
18
+ #
19
+ # This software has neither been tested nor approved for clinical use
20
+ # or for incorporation in a medical device.
21
+ # It is the redistributor's or user's responsibility to comply with any
22
+ # applicable local, state, national or international regulations.
23
+ #
24
+ require 'spec_helper'
25
+
26
+
27
+
28
+ describe DcmDict::Dictionary::DataElementRecord do
29
+ using DcmDict::Refine::Internal::ArrayRefineInternal
30
+
31
+ [
32
+ {tag_ps: '(0008,0010)',
33
+ tag_name: 'Recognition Code',
34
+ tag_key: 'RecognitionCode',
35
+ tag_vr: [:SH],
36
+ tag_vm: ['1'],
37
+ tag_note: 'RET',
38
+ tag_ary: [0x0008,0x0010],
39
+ tag_sym: :recognition_code,
40
+ tag_ndm: '00080010',
41
+ tag_str: '(0008,0010)',
42
+ tag_multiple: false
43
+ },
44
+ ].each do |data|
45
+ it "Handle Data Element Data correctly" do
46
+ der = DcmDict::Dictionary::DataElementRecord.new(data)
47
+ expect(der.tag_ps).to eq(data[:tag_ps])
48
+ expect(der.tag_name).to eq(data[:tag_name])
49
+ expect(der.tag_keyword).to eq(data[:tag_key])
50
+ expect(der.tag_vr).to eq(data[:tag_vr])
51
+ expect(der.tag_vm).to eq(data[:tag_vm])
52
+ expect(der.tag_note).to eq(data[:tag_note])
53
+ expect(der.tag_ary).to eq(data[:tag_ary])
54
+ expect(der.tag).to eq(data[:tag_ary])
55
+ expect(der.tag_sym).to eq(data[:tag_sym])
56
+ expect(der.tag_ndm).to eq(data[:tag_ndm])
57
+ expect(der.tag_str).to eq(data[:tag_str])
58
+ expect(der.tag_multiple?).to eq(data[:tag_multiple])
59
+
60
+ data.each do |key, expected_val|
61
+ expect(der.send(key)).to eq(expected_val)
62
+ end
63
+
64
+ end
65
+
66
+ include_examples "Record handle methods correctly",
67
+ DcmDict::Dictionary::DataElementRecord.new(data),
68
+ data
69
+
70
+
71
+ it "Handle group and element with explicit method" do
72
+ der = DcmDict::Dictionary::DataElementRecord.new(data)
73
+ expect(der.tag_group).to eq(data[:tag_ary].tag_group_num)
74
+ expect(der.tag_element).to eq(data[:tag_ary].tag_element_num)
75
+ end
76
+
77
+ it "data should be not modifiable" do
78
+ der = DcmDict::Dictionary::DataElementRecord.new(data)
79
+ old_ps = der.tag_ps.dup
80
+ expect{der.tag_ps << 'aaa'}.to raise_error
81
+ expect(der.tag_ps).to eq(old_ps)
82
+ end
83
+
84
+ it "should extract multiple tag record only for specific tag" do
85
+ der = DcmDict::Dictionary::DataElementRecord.new(data)
86
+ mrec = der.extract_multiple_tag_record(data[:tag_ary])
87
+ expect(mrec).to be_nil
88
+ end
89
+
90
+ end
91
+
92
+ {
93
+ # { tag_ps: '(60xx,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(6022,0010)', tag_sym: :overlay_rows, tag_ndm: '60220010', tag_ary: [24610, 16], tag_multiple: true, tag_note: ''},
94
+ [
95
+ '(6068,0010)', '60680010', [0x6068,0x0010]
96
+ ] => {
97
+ :source_data => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(6022,0010)', tag_sym: :overlay_rows, tag_ndm: '60220010', tag_ary: [24610, 16], tag_multiple: true, tag_note: ''},
98
+ :specific_data => { tag_ps: '(60XX,0010)', tag_name: "Overlay Rows", tag_key: 'OverlayRows', tag_vr: [:US], tag_vm: ["1"], tag_str: '(6068,0010)', tag_sym: :overlay_rows, tag_ndm: '60680010', tag_ary: [0x6068,0x0010], tag_multiple: true, tag_note: ''} }
99
+ }.each do |keys, multi_data|
100
+ it "check match for multiple tag definition from #{keys[0].inspect}" do
101
+ der = DcmDict::Dictionary::DataElementRecord.new(multi_data[:source_data])
102
+ keys.each do |key|
103
+ expect(der.send(:match_tag?, key)).to be_truthy
104
+ end
105
+ end
106
+
107
+ it "generate equivalent record for specific tag from #{keys[0].inspect}" do
108
+ der_multi = DcmDict::Dictionary::DataElementRecord.new(multi_data[:source_data])
109
+ der = der_multi.extract_multiple_tag_record(multi_data[:specific_data][:tag_ary])
110
+ multi_data[:specific_data].each do |key, val|
111
+ expect(der.send(key)).to eq(val)
112
+ end
113
+
114
+ end
115
+ end
116
+
117
+ end
@@ -0,0 +1,60 @@
1
+ #
2
+ # This file is part of DcmDict gem (dcm_dict).
3
+ #
4
+ # DcmDict is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # DcmDict is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with DcmDict. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ # This software has neither been tested nor approved for clinical use
18
+ # or for incorporation in a medical device.
19
+ # It is the redistributor's or user's responsibility to comply with any
20
+ # applicable local, state, national or international regulations.
21
+ #
22
+ require 'spec_helper'
23
+
24
+ describe DcmDict::Dictionary::UidDictionary do
25
+
26
+ include_examples "Map all source data",
27
+ [:uid_value, :uid_name],
28
+ DcmDict::SourceData::UidValuesData,
29
+ DcmDict::Dictionary::TheUidDictionary,
30
+ DcmDict::Dictionary::UidRecord,
31
+ [:uid_value, :uid_name, :uid_type]
32
+
33
+ {
34
+ '1.2.3.4.5.6' => { :uid_value => '1.2.3.4.5.6',
35
+ :uid_name => 'Unknown UID',
36
+ :uid_type => :unknown }
37
+ }.each do |uid, data|
38
+ include_examples "Handle specific record", "unknown uid",
39
+ uid, data, DcmDict::Dictionary::TheUidDictionary
40
+ end
41
+
42
+ [
43
+ '1.2.abc.3.4', 'this string is not a valid uid', '1.2.3.04.5'
44
+ ].each do |uid|
45
+ include_examples "Dictionary with wrong key",
46
+ uid, [:uid_value, :uid_name, :uid_type],
47
+ DcmDict::Dictionary::TheUidDictionary
48
+ end
49
+
50
+ include_examples "Dictionary Data not modifiable",
51
+ '1.2.840.10008.1.2', :uid_value, DcmDict::Dictionary::TheUidDictionary
52
+
53
+
54
+ include_examples "Concurrency support",
55
+ '1.2.840.10008.1.2',
56
+ DcmDict::Dictionary::TheUidDictionary,
57
+ {uid_value: '1.2.840.10008.1.2',
58
+ uid_name: "Implicit VR Little Endian: Default Transfer Syntax for DICOM",
59
+ uid_type: :transfer_syntax}
60
+ end