oddb2xml 2.0.5 → 2.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,502 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require "#{Dir.pwd}/lib/oddb2xml/parslet_compositions"
5
+ require 'parslet/rig/rspec'
6
+ require 'parslet/convenience'
7
+
8
+ RunAllParsingExamples = false # Takes over 3 minutes to run, all the other ones just a few seconds
9
+ GoIntoPry = false
10
+ describe CompositionParser do
11
+ let(:parser) { CompositionParser.new }
12
+ context "identifier parsing" do
13
+ let(:dose_parser) { parser.dose }
14
+ let(:identifier_parser) { parser.identifier }
15
+ let(:substance_parser) { parser.substance }
16
+ let(:substance_name_parser) { parser.substance_name }
17
+ let(:number_parser) { parser.number }
18
+
19
+ it "parses identifier" do
20
+ res1 = number_parser.parse_with_debug( "min.10^4.4 U..")
21
+ pp res1
22
+ binding.pry
23
+ end
24
+ end
25
+ end if false
26
+ describe CompositionParser do
27
+ let(:parser) { CompositionParser.new }
28
+ context "should help me find problems" do
29
+ let(:substance_name_parser) { parser.substance_name }
30
+
31
+ it "parses substance_name my manual test" do
32
+ res1 = substance_name_parser.parse_with_debug(
33
+ 'calendula officinalis D2' )
34
+ pp res1
35
+ res2 = substance_name_parser.parse_with_debug( 'macrogolum 3350' )
36
+ pp res2
37
+ res3 = substance_name_parser.parse_with_debug( 'virus poliomyelitis typus inactivatum' )
38
+ pp res3
39
+ binding.pry
40
+ end
41
+ end
42
+ context "should help me find problems" do
43
+ let(:substance_parser) { parser.substance }
44
+
45
+ it "parses substance my manual test" do
46
+ res1 = substance_parser.parse_with_debug(
47
+ 'calendula officinalis D2 2,2 mg' )
48
+ pp res1
49
+ res2 = substance_parser.parse_with_debug( 'macrogolum 3350 33.7 mg' )
50
+ pp res2
51
+ res3 = substance_parser.parse_with_debug(
52
+ 'calendula officinalis D2' )
53
+ pp res3
54
+ binding.pry
55
+ end
56
+ end if false
57
+ end if GoIntoPry
58
+
59
+ unless GoIntoPry
60
+ excipiens_tests = {
61
+ 'aether q.s. ad solutionem pro 1 g' => 'aether q.s. ad solutionem',
62
+ 'saccharum ad globulos pro 1 g' => 'saccarum',
63
+ 'q.s. ad solutionem pro 5 ml' => 'q.s. ad solutionem pro 5 ml',
64
+ 'excipiens ad solutionem pro 1 g, corresp. ethanolum 31 % V/V.' => 'zzz',
65
+ 'excipiens ad emulsionem pro 1 1' => 'aether q.s. ad solutionem',
66
+ 'aqua ad iniectabilia q.s. ad solutionem pro 1 ml' => "aqua ad iniectabilia q.s. ad solutionem",
67
+ 'aqua q.s. ad suspensionem pro 0.5 ml' => "aqua q.s. ad suspensionem",
68
+ 'excipiens ad pulverem corresp. suspensio reconstituta 1 ml' => 'Excipiens',
69
+ 'excipiens ad pulverem pro 1000 mg' => 'Excipiens',
70
+ 'excipiens ad emulsionem pro 1 ml' => 'Excipiens',
71
+ 'excipiens ad pulverem pro charta' => 'Excipiens',
72
+ 'excipiens ad pulverem' => 'Excipiens ad pulverem',
73
+ 'excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V' => 'Excipiens',
74
+ 'excipiens ad solutionem pro 2 ml' => 'Excipiens',
75
+ 'excipiens ad solutionem pro 3 ml corresp. 50 µg' => 'Excipiens',
76
+ 'excipiens ad solutionem pro 4 ml corresp. 50 µg pro dosi' => 'Excipiens',
77
+ 'excipiens pro compresso' => 'Excipiens pro compresso',
78
+ }
79
+
80
+ substance_tests = {
81
+ "U = Histamin Equivalent Prick" => 'U = Histamin Equivalent Prick', # 58566
82
+ "Vipera aspis > 1000 LD50 mus et Vipera berus > 500 LD50, natrii chloridum" => "Vipera Aspis > 1000 Ld50 Mus",
83
+ "Vipera aspis > 1000 LD50 mus et Vipera berus > 500 LD50, natrii chloridum, polysorbatum 80" => "Vipera Aspis > 1000 Ld50 Mus",
84
+ "Vipera aspis > 1000 LD50 mus et Vipera berus > 500 LD50, natrii chloridum, polysorbatum 80, aqua ad iniectabilia ad solutionem pro 4 ml" => "Vipera Aspis > 1000 Ld50 Mus",
85
+ "Vipera aspis > 1000 LD50 mus et Vipera berus > 500 LD50, natrii chloridum, polysorbatum 80, aqua ad iniectabilia q.s. ad solutionem pro 4 ml" => "Vipera Aspis > 1000 Ld50 Mus",
86
+ "antitoxinum equis Fab'" => "Antitoxinum Equis Fab'",
87
+ "antitoxinum equis Fab'x" => "Antitoxinum Equis Fab'x",
88
+ "aqua ad iniectabilia ad solutionem pro 4 ml" => nil,# "Aqua Ad Iniectabilia Ad Solutionem Pro",
89
+ "calcii gluconas 100 mg corresp. calcium 100 mg" => 'Calcii Gluconas',
90
+ "calcii gluconas 100 mg et calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg corresp. calcium 100 mg" => 'Calcii Gluconas',
91
+ "calcii gluconas 100 mg et calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg" => 'Calcii Gluconas',
92
+ "calcii gluconas corresp. calcium 100 mg" => 'Calcii Gluconas Corresp. Calcium',
93
+ "calcii lactas pentahydricus 25 mg corresp. calcium 100 mg" => 'Calcii Lactas Pentahydricus',
94
+ "calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg corresp. calcium 100 mg" => 'Calcii Lactas Pentahydricus',
95
+ "calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg" => 'Calcii Lactas Pentahydricus',
96
+ "calcii lactas pentahydricus 25 mg" => 'Calcii Lactas Pentahydricus',
97
+ "conserv.: E 217, E 219" => "E 217",
98
+ "conserv.: E 217, E 219, natrii dehydroacetas" => "E 217",
99
+ "conserv.: E 217, E 219, natrii dehydroacetas, excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi" => "line #{__LINE__}",
100
+ "ethanolum 59.5 % V/V" => 'Ethanolum',
101
+ "excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi" => "Excipiens Ad Solutionem Pro 1 Ml Corresp. 50 µg Pro Dosi",
102
+ "excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi" => "line #{__LINE__}",
103
+ "globulina equina (immunisé')" => "Globulina Equina (immunisé')",
104
+ "globulina equina (immunisé)" => 'Globulina Equina (immunisé)',
105
+ "globulina equina'" => "Globulina Equina'",
106
+ "osseinum-hydroxyapatit 200 mg corresp. collagena 52 mg et calcium 43 mg" => "Osseinum-hydroxyapatit",
107
+ "viperis antitoxinum equis F(ab')" => "Viperis Antitoxinum Equis F(ab')",
108
+ "viperis antitoxinum equis F(ab')2" => "Viperis Antitoxinum Equis F(ab')2",
109
+ "viperis antitoxinum equis F(ab)" => "Viperis Antitoxinum Equis F(ab)",
110
+ "xylometazolini hydrochloridum 0.5 mg, natrii hyaluronas, conserv.: E 217, E 219, natrii dehydroacetas, excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi" => "line #{__LINE__}",
111
+ '1-Chloro-2,2,5,5-tetramethyl-4-oxoimidazolidine 75 mg' => '1-chloro-2,2,5,5-tetramethyl-4-oxoimidazolidine',
112
+ '9,11-linolicum acidum' => "9,11-linolicum Acidum",
113
+ '9,11-linolicum' => "9,11-linolicum",
114
+ 'A/California/7/2009 virus NYMC X-179A' => 'A/california/7/2009 Virus Nymc X-179a',
115
+ 'DER: 1:4' => 'Der: 1:4',
116
+ 'DER: 3.5:1' => 'Der: 3.5:1',
117
+ 'DER: 6-8:1' => 'Der: 6-8:1',
118
+ 'DTPa-IPV-Komponente (Suspension)' => 'Dtpa-ipv-komponente (suspension)',
119
+ 'DTPa-IPV-Komponente' => 'Dtpa-ipv-komponente',
120
+ 'E 160(a)' => 'E 160(a)',
121
+ 'E 270' => 'E 270',
122
+ 'X-179A' => 'X-179a',
123
+ 'X179A' => 'X179a',
124
+ 'absinthii herba 1.2 g pro charta' => "Absinthii Herba",
125
+ 'acidum 9,11-linolicum 3.25 mg' => "Acidum 9,11-linolicum",
126
+ 'acidum 9,11-linolicum' => "Acidum 9,11-linolicum",
127
+ 'antiox.: E 321' => 'E 321',
128
+ 'benzoe 40 guttae' => 'Benzoe',
129
+ 'benzoe 40 ml' => 'Benzoe',
130
+ 'color.: E 160(a)' => 'E 160', # TODO: or E 160(a) ??
131
+ 'ethanolum 70-78 % V/V' => "Ethanolum",
132
+ 'excipiens ad solutionem pro 1 ml' => "Ad Solutionem Pro",
133
+ 'ginseng extractum corresp. ginsenosidea 3.4 mg' => 'Ginseng Extractum Corresp. Ginsenosidea',
134
+ 'moelle épinière' => 'Moelle épinière',
135
+ 'pimpinellae radix 15 % ad pulverem' => 'Pimpinellae Radix',
136
+ 'retinoli 7900 U.I.' => 'Retinoli',
137
+ 'retinoli palmitas 7900 U.I.' => 'Retinoli Palmitas',
138
+ 'sennae folium 75 % corresp. hydroxyanthracenae 2.7 %' => 'Sennae Folium',
139
+ 'silybum marianum D3 0.3 ml ad solutionem pro 2 ml' => "Silybum Marianum D3",
140
+ 'silybum marianum D3 0.3 ml ad solutionem pro 3 ml corresp. ethanolum 30 % V/V' => "line #{__LINE__}",
141
+ 'streptococcus pneumoniae 12 %' => 'Streptococcus Pneumoniae',
142
+ 'virus NYMC X-179A' => 'Virus Nymc X-179a',
143
+ 'virus poliomyelitis typus 1 inactivatum (D-Antigen) 2 mg' => "Virus Poliomyelitis Typus 1 Inactivatum (d-antigen)",
144
+ 'virus poliomyelitis typus 1 inactivatum (D-Antigen)' => 'Virus Poliomyelitis Typus 1 Inactivatum (d-antigen)',
145
+ 'virus poliomyelitis typus 1 inactivatum D-Antigen' => 'Virus Poliomyelitis Typus 1 Inactivatum D-antigen',
146
+ 'virus poliomyelitis typus inactivatum (D-Antigen) 2 mg' => 'Virus Poliomyelitis Typus Inactivatum (d-antigen)',
147
+ 'virus poliomyelitis typus inactivatum (D-Antigen)' => 'Virus Poliomyelitis Typus Inactivatum (d-antigen)',
148
+ 'virus poliomyelitis typus inactivatum D-Antigen' => 'Virus Poliomyelitis Typus Inactivatum D-antigen',
149
+ 'virus poliomyelitis' => 'Virus Poliomyelitis',
150
+ 'virus' => 'Virus',
151
+ 'xenonum(133-Xe) 74 -740 MBq' => 'Xenonum(133-xe)',
152
+ 'yttrii(90-Y) chloridum zum Kalibrierungszeitpunkt 1850 MBq' => 'Yttrii(90-y) Chloridum Zum Kalibrierungszeitpunkt',
153
+ 'yttrii(90-Y) chloridum zum Kalibrierungszeitpunkt' => 'Yttrii(90-y) Chloridum Zum Kalibrierungszeitpunkt',
154
+ }
155
+
156
+
157
+ composition_tests = [
158
+ "E 160(a)",
159
+ "E 160(a), adeps lanae",
160
+ "achillea millefolium D3 2,2 mg",
161
+ "achillea millefolium D3 2,2 mg, aconitum napellus D2 1,32 mg, arnica montana D2 2,2 mg",
162
+ "achillea millefolium D3 2,2 mg, aconitum napellus D2 1,32 mg, arnica montana D2 2,2 mg, atropa belladonna D2 2,2 mg, bellis perennis D2 1,1 mg, calendula officinalis D2 2,2 mg, chamomilla recutita D3 2,2 mg, echinacea D2 0,55 mg, echinacea purpurea D2 0,55 mg, hamamelis virginiana D1 0,22 mg, hepar sulfuris D6 2,2 mg hypericum perforatum D2 0,66 mg, mercurius solubilis hahnemanni D8 1,1 mg, symphytum officinale D6 2,2 mg, aqua ad iniectabilia, natrii chloridum q.s. ad solutionem pro 2,2 ml.\n",
163
+ "acida oligoinsaturata 8.15 mg",
164
+ "acida oligoinsaturata 8.15 mg, alcoholes adipis lanae, adeps lanae, color.: E 160(a), excipiens ad emulsionem pro 1 g.\n",
165
+ "acidum 9,11-linolicum 3.25 mg",
166
+ "acidum 9,11-linolicum 3.25 mg, acidum 9,12-linolicum 1.3 mg, aromatica, conserv.: E 215, E 218, excipiens ad emulsionem pro 1 g.\n",
167
+ "adeps lanae, E 160",
168
+ "adeps lanae, E 160(a)",
169
+ "adeps lanae, color.: E 160(a)",
170
+ "adeps lanae, color.: E 160(a), excipiens ad emulsionem pro 1 g.\n",
171
+ "adeps lanae, color.: E 160(a), excipiens ad emulsionem pro 1 g.\n",
172
+ "alcoholes adipis lanae, adeps lanae, color.: E 160(a), excipiens ad emulsionem pro 1 g.\n",
173
+ "atropa belladonna D2 2,2 mg, bellis perennis D2 1,1 mg, calendula officinalis D2 2,2 mg, chamomilla recutita D3 2,2 mg, echinacea D2 0,55 mg, echinacea purpurea D2 0,55 mg, hamamelis virginiana D1 0,22 mg, hepar sulfuris D6 2,2 mg hypericum perforatum D2 0,66 mg, mercurius solubilis hahnemanni D8 1,1 mg, symphytum officinale D6 2,2 mg, aqua ad iniectabilia, natrii chloridum q.s. ad solutionem pro 2,2 ml.\n",
174
+ "berberidis corticis extractum ethanolicum liquidum 35 mg, DER: 6:1, combreti extractum aquosum liquidum 18 mg, DER: 1:4, cynarae extractum ethanolicum liquidum 36 mg, DER: 1:1, orthosiphonis folii extractum ethanolicum liquidum 18 mg, DER: 3.5:1, excipiens ad solutionem pro 1 ml, corresp. ethanolum 74 % V/V\n",
175
+ "cholecalciferolum 250 U.I., acidum ascorbicum 20 mg, calcii gluconas 100 mg et calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg corresp. calcium 100 mg, arom.: saccharinum natricum, natrii cyclamas, vanillinum et alia, excipiens pro compresso obducto.",
176
+ "color.: E 160(a)",
177
+ "color.: E 160(a)\n",
178
+ "conserv.: E 217, E 219, natrii dehydroacetas",
179
+ "conserv.: E 217, E 219, natrii dehydroacetas, excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi.",
180
+ "excipiens ad emulsionem pro 1 g.\n",
181
+ "excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi.",
182
+ "extractum ethanolicum et glycerolicum liquidum ex absinthii herba 0.7 mg, cinnamomi cortex 3.8 mg, guaiaci lignum 14.3 mg, millefolii herba 7 mg, rhoeados flos 11 mg, tormentillae rhizoma 9.5 mg, balsamum tolutanum 0.3 mg, benzoe tonkinensis 4.8 mg, myrrha 2.4 mg, olibanum 0.9 mg, excipiens ad solutionem pro 1 ml, corresp. 40 guttae, corresp. ethanolum 37 % V/V",
183
+ "hamamelis virginiana D1 0,22 mg, hepar sulfuris D6 2,2 mg hypericum perforatum D2 0,66 mg, mercurius solubilis hahnemanni D8 1,1 mg, symphytum officinale D6 2,2 mg, aqua ad iniectabilia, natrii chloridum q.s. ad solutionem pro 2,2 ml.\n",
184
+ "hepar sulfuris D6 2,2 mg hypericum perforatum D2 0,66 mg",
185
+ "hepar sulfuris D6 2,2 mg hypericum perforatum D2 0,66 mg, mercurius solubilis hahnemanni D8 1,1 mg, symphytum officinale D6 2,2 mg, aqua ad iniectabilia, natrii chloridum q.s. ad solutionem pro 2,2 ml.\n",
186
+ "hyaluronas, conserv.: E 217, E 219",
187
+ "hypericum perforatum D2 0,66 mg, mercurius solubilis hahnemanni D8 1,1 mg, symphytum officinale D6 2,2 mg, aqua ad iniectabilia, natrii chloridum q.s. ad solutionem pro 2,2 ml.\n",
188
+ "mercurius solubilis hahnemanni D8 1,1 mg, symphytum officinale D6 2,2 mg, aqua ad iniectabilia, natrii chloridum q.s. ad solutionem pro 2,2 ml.\n",
189
+ "mercurius solubilis hahnemanni D8 1,1 mg, symphytum officinale D6 2,2 mg, aqua ad iniectabilia, natrii chloridum q.s. ad solutionem pro 2,2 ml.\n",
190
+ "natrii dehydroacetas, excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi.",
191
+ "osseinum-hydroxyapatit 200 mg corresp. collagena 52 mg et calcium 43 mg",
192
+ "rhei extractum ethanolicum siccum 50 mg corresp. glycosida anthrachinoni 5 mg, acidum salicylicum 10 mg, excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V",
193
+ "sennae folium 75 % corresp. hydroxyanthracenae 2.7 %",
194
+ "viperis antitoxinum equis F(ab')2 corresp. Vipera aspis > 1000 LD50 mus et Vipera berus > 500 LD50 mus et Vipera ammodytes > 1000 LD50 mus, natrii chloridum, polysorbatum 80, aqua ad iniectabilia q.s. ad solutionem pro 4 ml.",
195
+ "xylometazolini hydrochloridum 0.5 mg, natrii hyaluronas, conserv.: E 217, E 219, natrii dehydroacetas, excipiens ad solutionem pro 1 ml corresp. 50 µg pro dosi.",
196
+ 'excipiens ad pulverem corresp. suspensio reconstituta 1 ml',
197
+ 'gasum inhalationis, pro vitro',
198
+ 'toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg',
199
+ 'xenonum 74 -740 MBq',
200
+ ]
201
+
202
+ nr_parsing_tests = excipiens_tests.size + substance_tests.size + composition_tests.size
203
+ if RunAllParsingExamples
204
+ puts "Testing includes #{nr_parsing_tests} lines to be parsed"
205
+ else
206
+ puts "Skip testing includes #{nr_parsing_tests} lines to be parsed"
207
+ end
208
+
209
+ # Here follow some low level test of the most important parts of the parser
210
+ describe CompositionParser do
211
+ let(:parser) { CompositionParser.new }
212
+
213
+ context "should return correct dose for 2*10^9 CFU.'" do
214
+ let(:dose_parse) { parser.dose }
215
+
216
+ should_pass = [
217
+ "40 U.",
218
+ "50'000 U.I.",
219
+ "1 Mio. U.I.",
220
+ '3 Mg',
221
+ '2 mg',
222
+ '0.3 ml',
223
+ '0.01 mg/ml',
224
+ '3 mg/ml',
225
+ '2*10^9 CFU',
226
+ '10^4.4 U.',
227
+ '20 mg',
228
+ '100 % m/m',
229
+ '308.7 mg/g',
230
+ '0.11 µg/g',
231
+ '2.2 g',
232
+ '2,2 g',
233
+ '59.5 % V/V',
234
+ '50 %',
235
+ '80-120 g',
236
+ ].each {
237
+ |id|
238
+ it "parses dose #{id}" do
239
+ expect(dose_parse).to parse(id)
240
+ end
241
+ }
242
+ should_not_pass = [
243
+ '10 2*10^9 CFU',
244
+ '20 20 mg',
245
+ '50%', # This can be part of a name like ferrum-quarz 50%
246
+ ].each {
247
+ |id|
248
+ it "parses dose #{id}" do
249
+ expect(dose_parse).to_not parse(id)
250
+ end
251
+ }
252
+ end
253
+
254
+ context "identifier parsing" do
255
+ let(:identifier_parser) { parser.identifier }
256
+
257
+ it "parses identifier" do
258
+ expect(identifier_parser).to parse("calcium")
259
+ expect(identifier_parser).to parse("D2")
260
+ expect(identifier_parser).to parse("9,11-linolicum")
261
+ expect(identifier_parser).to parse("xenonum(133-Xe)")
262
+ expect(identifier_parser).to_not parse("10")
263
+ expect(identifier_parser).to_not parse("pro asdf")
264
+ expect(identifier_parser).to_not parse("calcium,")
265
+ end
266
+ end
267
+
268
+ context "identifier_with_comma parsing" do
269
+ let(:identifier_with_comma_parser) { parser.identifier_with_comma }
270
+
271
+ it "parses identifier_with_comma" do
272
+ expect(identifier_with_comma_parser).to parse("calcium")
273
+ end
274
+ it "parses identifier_with_comma" do
275
+ expect(identifier_with_comma_parser).to parse("9,11-linolicum")
276
+ expect(identifier_with_comma_parser).to parse("a_bart_c")
277
+ expect(identifier_with_comma_parser).to parse("éxcuäseé")
278
+ end
279
+ it "parses identifier_with_comma" do
280
+ expect(identifier_with_comma_parser).to_not parse("10")
281
+ expect(identifier_with_comma_parser).to_not parse("9,11-lino licum")
282
+ end
283
+ it "parses identifier_with_comma no comma at end allowed" do
284
+ expect(identifier_with_comma_parser).to_not parse("calcium9,")
285
+ end
286
+ it "parses identifier_with_comma no comma at end allowed" do
287
+ expect(identifier_with_comma_parser).to_not parse("calcium,")
288
+ end
289
+ it "parses identifier_with_comma no comma at end allowed" do
290
+ expect(identifier_with_comma_parser).to_not parse("9,11-lino licum,")
291
+ end
292
+ it "parses identifier_with_comma" do
293
+ expect(identifier_with_comma_parser).to_not parse("9,11-linolicum;")
294
+ end
295
+ end
296
+
297
+ context "label parsing" do
298
+ let(:label_parser) { parser.label }
299
+
300
+ should_pass = [
301
+ 'A):',
302
+ 'II)',
303
+ 'V)',
304
+ 'A): acari allergeni extractum 50 U.: ',
305
+ ].each {
306
+ |id|
307
+ it "parses label #{id}" do
308
+ expect(label_parser).to parse(id)
309
+ end
310
+ }
311
+ should_not_pass = [
312
+ 'I): albuminum humanum colloidale 0.5 mg,',
313
+ ].each {
314
+ |id|
315
+ it "parses label #{id}" do
316
+ expect(label_parser).to_not parse(id)
317
+ end
318
+ }
319
+ end
320
+
321
+ context "substance parsing" do
322
+ let(:substance_parser) { parser.substance }
323
+
324
+ should_pass = [
325
+ 'calcium',
326
+ 'calcium 10 mg',
327
+ 'ferrum-quarz 50% 20 mg',
328
+ 'macrogolum 3350',
329
+ 'pollinis allergeni extractum (Phleum pratense) 10 U.',
330
+ 'phenoxymethylpenicillinum kalicum 1 U.I.',
331
+ 'phenoxymethylpenicillinum kalicum 1 Mio. U.I.',
332
+ 'retinoli palmitas 7900 U.I.',
333
+ ].each {
334
+ |id|
335
+ it "parses substance #{id}" do
336
+ expect(substance_parser).to parse(id)
337
+ end
338
+ }
339
+ it "parses substance calcium, zwei" do expect(substance_parser).to_not parse("calcium, zwei") end
340
+
341
+ puts "Testing whether #{excipiens_tests.size} excipiens can be parsed"
342
+ let(:substance_parser) { parser.substance }
343
+ excipiens_tests.each{
344
+ |value, name|
345
+ it "parses substance #{value}" do expect(substance_parser).to parse(value) end
346
+ }
347
+
348
+ end
349
+
350
+ context "substance_name parsing" do
351
+ let(:substance_name_parser) { parser.substance_name }
352
+
353
+ should_pass = [
354
+ 'calcium',
355
+ 'calendula officinalis D2',
356
+ 'pollinis allergeni extractum (Phleum pratense)',
357
+ 'retinoli palmitas',
358
+ ].each {
359
+ |id|
360
+ it "parses substance_name #{id}" do
361
+ expect(substance_name_parser).to parse(id)
362
+ end
363
+ }
364
+
365
+ should_not_pass = [
366
+ 'calcium 10 mg',
367
+ 'ferrum-quarz 50% 20 mg',
368
+ 'calendula officinalis D2 2.2 mg',
369
+ 'macrogolum 3.2',
370
+ 'macrogolum 3350 10 mg',
371
+ 'pollinis allergeni extractum (Phleum pratense) 10 U.',
372
+ 'retinoli palmitas 7900 U.I.',
373
+ ].each {
374
+ |id|
375
+ it "parses substance_name #{id}" do
376
+ expect(substance_name_parser).not_to parse(id)
377
+ end
378
+ }
379
+
380
+ end
381
+
382
+ context "simple_substance parsing" do
383
+ let(:simple_substance_parser) { parser.simple_substance }
384
+ should_pass = [
385
+ "2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)",
386
+ "calcium part_b",
387
+ "calcium 10",
388
+ "calcium 10 mg",
389
+ # 'macrogolum 3350 10 mg',
390
+ "F(ab')2",
391
+ ].each {
392
+ |id|
393
+ it "parses simple_substance #{id}" do
394
+ expect(simple_substance_parser).to parse(id)
395
+ end
396
+ }
397
+ should_not_pass = [
398
+ "calcium corresp. 10 ml",
399
+ "excipiens",
400
+ "calcium ut magnesium",
401
+ "calcium et magnesium",
402
+ ].each {
403
+ |id|
404
+ it "parses simple_substance #{id} should fail" do
405
+ expect(simple_substance_parser).to_not parse(id)
406
+ end
407
+ }
408
+ end
409
+
410
+ context "substance_name parsing" do
411
+ should_pass = [
412
+ 'calcium',
413
+ 'calcium par_2 Part_C',
414
+ 'semecarpus anacardium D12',
415
+ 'virus poliomyelitis typus inactivatum',
416
+ 'virus poliomyelitis typus inactivatum (D-Antigen)',
417
+ 'virus poliomyelitis typus 1 inactivatum (D-Antigen)',
418
+ 'stanni(II) chloridum dihydricum',
419
+ 'ethanol.',
420
+ 'DER: 1:4',
421
+ 'DER: 3-5:1',
422
+ 'DER: 6-8:1',
423
+ 'DER: 4.0-9.0:1',
424
+ 'calendula officinalis D2',
425
+ # "Viperis Antitoxinum Equis F(ab')2", swissmedic patch, as only one occurrence
426
+ "xenonum(133-Xe)",
427
+ ].each {
428
+ |id|
429
+ let(:substance_name_parser) { parser.substance_name }
430
+ it "parses substance_name #{id}" do
431
+ expect(substance_name_parser).to parse(id)
432
+ end
433
+ }
434
+ should_not_pass = [
435
+ 'calendula officinalis D2 2,2 mg',
436
+ 'calcium corresp. xx',
437
+ 'calcium residui: xx',
438
+ 'calcium ut xx',
439
+ 'calcium et xx',
440
+ 'calcium,',
441
+ 'calcium9,',
442
+ 'excipiens pro',
443
+ 'albuminum humanum colloidale, stanni(II) chloridum dihydricum',
444
+ ].each {
445
+ |id|
446
+ let(:substance_name_parser) { parser.substance_name }
447
+ it "parses substance_name #{id} should fail" do
448
+ expect(substance_name_parser).to_not parse(id)
449
+ end
450
+ }
451
+ end
452
+
453
+ context "composition parsing" do
454
+ let(:composition_parser) { parser.composition }
455
+ should_pass = [
456
+ 'calcium',
457
+ 'calcium par_2 Part_C',
458
+ 'virus poliomyelitis typus inactivatum',
459
+ 'virus poliomyelitis typus inactivatum (D-Antigen)',
460
+ 'virus poliomyelitis typus 1 inactivatum (D-Antigen)',
461
+ 'toxoidum pertussis 25 µg et haemagglutininum filamentosum 15 µg',
462
+ ].each {
463
+ |id|
464
+ it "parses composition #{id}" do
465
+ expect(composition_parser).to parse(id)
466
+ end
467
+ }
468
+
469
+
470
+ puts "Testing whether #{composition_tests.size} compositions can be parsed"
471
+ composition_tests.each{
472
+ |value, name|
473
+ let(:composition_parser) { parser.composition }
474
+ it "parses composition #{value}" do
475
+ expect(composition_parser).to parse(value)
476
+ end
477
+ }
478
+ puts "Testing whether #{substance_tests.size} substances can be parsed"
479
+ substance_tests.each{
480
+ |value, name|
481
+ it "parses substance #{value}" do
482
+ expect(composition_parser).to parse(value)
483
+ end
484
+ }
485
+
486
+ if RunAllParsingExamples
487
+ specify { expect( File.exists?(AllCompositionLines)).to eq true }
488
+ composition_lines = IO.readlines(AllCompositionLines)
489
+ puts "Testing whether all #{composition_lines.size} lines in #{File.basename(AllCompositionLines)} can be parsed"
490
+ composition_lines.each{
491
+ |value, name|
492
+ let(:composition_parser) { parser.composition }
493
+ it "parses composition #{value}" do expect(composition_parser).to parse(value) end
494
+ }
495
+ else
496
+ puts "Skip testing whether #{composition_tests.size} compositions and #{substance_tests.size} substances can be parsed"
497
+ end
498
+
499
+ end
500
+
501
+ end
502
+ end