oddb2xml 2.0.5 → 2.0.6

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.
@@ -0,0 +1,1268 @@
1
+ # encoding: utf-8
2
+
3
+ begin
4
+ require 'pry'
5
+ rescue LoadError
6
+ end
7
+ require 'pp'
8
+ require 'spec_helper'
9
+ require "#{Dir.pwd}/lib/oddb2xml/parslet_compositions"
10
+ require 'parslet/rig/rspec'
11
+
12
+ hostname = Socket.gethostbyname(Socket.gethostname).first
13
+ RunAllCompositionsTests = /travis|localhost/i.match(hostname) != nil # takes about five minutes to run!
14
+ puts "hostname is #{hostname} RunAllCompositionsTests #{RunAllCompositionsTests}"
15
+ # Testing whether 8937 composition lines can be parsed. Found 380 errors in 293 seconds
16
+ # 520 examples, 20 failures, 1 pending
17
+
18
+ RunCompositionExamples = true
19
+ RunSubstanceExamples = true
20
+ RunFailingSpec = false
21
+ RunExcipiensTest = true
22
+ RunSpecificTests = true
23
+ RunMostImportantParserTests = true
24
+
25
+ describe ParseComposition do
26
+ to_add = %(
27
+ VERBOSE_MESSAGES = true
28
+ pp composition; binding.pry
29
+ )
30
+ end
31
+
32
+ describe ParseComposition do
33
+
34
+ context "should handle missing arom.: before excipiens" do
35
+ string = "nicotinum 4 mg ut nicotini resinas, aromatica, antiox.: E 321, arom.: excipiens pro praeparatione"
36
+ composition = ParseComposition.from_string(string)
37
+ specify { expect(composition.source).to eq string}
38
+ specify { expect( composition.substances.size).to eq 3 }
39
+ specify { expect( composition.substances.first.name).to eq "Nicotinum" } # TODO: is not Benzocainum
40
+ end
41
+
42
+ context "should handle missing Label A:) in pollinis allergeni extractu" do
43
+ string = '"pollinis allergeni extractum (alnus glutinosa, betula alba, corylus avellana) 300 U.: excipiens ad solutionem pro 1 ml'
44
+ composition = ParseComposition.from_string(string)
45
+ specify { expect(composition.source).to eq string}
46
+ specify { expect( composition.substances.size).to eq 0 }
47
+ specify { expect( composition.label).to eq 'A' }
48
+ specify { expect( composition.composition.label_description).to eq 'pollinis allergeni extractum (alnus glutinosa, betula alba, corylus avellana) 300 U.' }
49
+ end
50
+
51
+ context "should handle dose with /" do
52
+ string = 'poly(dl-lactidum-co-glycolidum) 75/25'
53
+ composition = ParseComposition.from_string(string)
54
+ specify { expect(composition.source).to eq string}
55
+ specify { expect( composition.substances.first.name).to eq "Poly(dl-lactidum-co-glycolidum)" }
56
+ specify { expect( composition.substances.first.dose.to_s).to eq '75/25' }
57
+ end
58
+
59
+ context "should handle per centum" do
60
+ string = 'acidum nitricum 70 per centum 537 mg, acidum aceticum glaciale 20.4 mg, acidum oxalicum dihydricum 58.6 mg, zinci nitras hexahydricus 6 mg, excipiens ad solutionem pro 1 ml'
61
+ composition = ParseComposition.from_string(string)
62
+ specify { expect(composition.source).to eq string}
63
+ specify { expect( composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum)" }
64
+ end
65
+
66
+ context "should handle Praeparatio sicca and polysorbatum" do
67
+ string = 'Praeparatio sicca cum solvens: praeparatio sicca: albiglutidum 66.95 mg, trehalosum dihydricum, mannitolum, dinatrii phosphas anhydricus, natrii dihydrogenophosphas monohydricus, polysorbatum 80, solvens: aqua ad iniectabilia 0.65 ml pro vitro'
68
+ composition = ParseComposition.from_string(string)
69
+ specify { expect(composition.source).to eq string}
70
+ specify { expect( composition.substances.first.name).to eq "Albiglutidum)" }
71
+ specify { expect( composition.label).to eq "Praeparatio sicca cum solvens: praeparatio sicca:" }
72
+ end
73
+
74
+ context "should handle dose with +/-" do
75
+ string = 'enzephalitidis japanensis virus antigenum (Stamm: SA-14-2) 6.0 +/-1.2 µg, aluminium ut aluminii oxidum hydricum, kalii dihydrogenophosphas, dinatrii phosphas anhydricus, natrii chloridum, aqua q.s. ad solutionem pro 0.5 ml'
76
+ composition = ParseComposition.from_string(string)
77
+ specify { expect(composition.source).to eq string}
78
+ specify { expect( composition.substances.first.name).to eq "Enzephalitidis Japanensis Virus Antigenum (stamm: Sa-14-2)" }
79
+ specify { expect( composition.substances.first.dose.to_s).to eq '6.0 +/-1.2 µg/0.5 ml' }
80
+ end
81
+
82
+ context "should handle label Praeparatio cryodesiccata (Thrombin)" do
83
+ string = 'Praeparatio cryodesiccata (Thrombin): thrombinum humanum 500 U.I., natrii chloridum, natrii citras dihydricus, pro vitro'
84
+ composition = ParseComposition.from_string(string)
85
+ specify { expect(composition.source).to eq string}
86
+ specify { expect( composition.substances.first.name).to eq "Thrombinum Humanum" }
87
+ specify { expect( composition.label).to eq "Praeparatio cryodesiccata (Thrombin):" }
88
+ end
89
+
90
+ context "should handle '150 U.I. hFSH et 150 U.I. hLH'" do
91
+ string =
92
+ 'Tela cum praeparatione (Panel 1): niccoli sulfas 0.16 mg, alcoholes adipis lanae 0.81 mg, neomycini sulfas 0.49 mg, kalii dichromas 44 µg, Cain-mix: benzocainum 0.364 mg, cinchocaini hydrochloridum 73 µg, tetracaini hydrochloridum 73 µg, Parfum-Mix: amylcinnamaldehydum 15 µg, isoeugenolum 15 µg, cinnamaldehydum 34 µg, eugenolum 34 µg, alcohol cinnamylicus 54 µg, hydroxycitronellalum 54 µg, geraniolum 70 µg, evernia prunastri 70 µg, colophonium 0.97 mg, E 320, E 321, Paraben-Mix: E 218 0.16 mg, E 214 0.16 mg, E 216 0.16 mg, butylis parahydroxybenzoas 0.16 mg, benzylis parahydroxybenzoas 0.16 mg, Negativ-Kontrolle, balsamum peruvianum 0.65 mg, ethylendiamini dihydrochloridum 41 µg, cobalti dichloridum 16 µg, excipiens pro praeparatione'
93
+ composition = ParseComposition.from_string(string)
94
+ specify { expect(composition.source).to eq string}
95
+ context "wrong name Benzocainum" do
96
+ specify { expect( composition.substances.first.name).to eq "Niccoli Sulfas" } # TODO: is not Benzocainum
97
+ end
98
+ specify { expect( composition.label).to eq "Tela cum praeparatione (Panel 1):" }
99
+ end
100
+
101
+ context "should handle '150 U.I. hFSH et 150 U.I. hLH'" do
102
+ string = 'Praeparatio cryodesiccata: menotropinum 150 U.I. hFSH et 150 U.I. hLH, gonadotropinum chorionicum 7-21 U.I. hCG, lactosum monohydricum, pro vitro'
103
+ composition = ParseComposition.from_string(string)
104
+ specify { expect(composition.source).to eq string}
105
+ specify { expect( composition.substances.first.name).to eq "Menotropinum" }
106
+ specify { expect( composition.substances.first.dose.to_s).to eq "150 U.I. hFSH et 150 U.I. hLH" }
107
+ end
108
+
109
+ context "should handle '&' and 'deklr.'" do
110
+ string = 'TM: cardiospermum halicacabum 100 mg, cetearyl octanoat & isopropylmyristat deklar., alcohol benzylicus, aqua q.s. ad unguentum pro'
111
+ composition = ParseComposition.from_string(string)
112
+ composition = ParseComposition.from_string('macrogoli 9 aether laurilicus 5 mg, ethanolum 50 mg')
113
+ specify { expect( composition.substances.first.name).to eq "Tm: Cardiospermum Halicacabum" }
114
+ end
115
+
116
+ context "should handle 'potenziert mit: excipiens pro compresso'" do
117
+ string = 'ambra grisea D6 30 mg, conium maculatum D3 30 mg, anamirta cocculus D4 210 mg, petroleum rectificatum D8 30 mg, potenziert mit: excipiens pro compresso'
118
+ composition = ParseComposition.from_string(string)
119
+ specify { expect(composition.source).to eq string}
120
+ specify { expect(composition.label).to eq nil }
121
+ specify { expect(composition.label_description).to eq nil }
122
+ specify { expect(composition.galenic_form).to eq nil }
123
+ specify { expect(composition.route_of_administration).to eq nil }
124
+ specify { expect( composition.substances.first.name).to eq "Terra Silicea Spec." }
125
+ end
126
+
127
+ context "allow substancename with 'ethanol.'" do
128
+ string = "mandragora ethanol. decoctum D1 30 mg"
129
+ composition = ParseComposition.from_string(string)
130
+ specify { expect(composition.substances.size).to eq 1 }
131
+ specify { expect(composition.substances.first.name).to eq "Mandragora Ethanol. Decoctum D1" }
132
+ specify { expect(composition.substances.first.dose.to_s).to eq "30 mg" }
133
+ end
134
+
135
+ context "allow substance complicated, calculated dose '6.0 +/-1.2 µg'" do
136
+ string =
137
+ "piscis oleum 500 mg corresp. acida carboxylica omega-3 oligoinsaturata 150 mg ut acidum eicosapentaenoicum 90 mg et acidum docosahexaenoicum 60 mg, excipiens pro capsula"
138
+ composition = ParseComposition.from_string(string)
139
+ specify { expect(composition.substances.first.name).to eq 'Magnesii Aspartas Dihydricus' } # TODO:
140
+ specify { expect(composition.substances.first.chemical_substance.name).to eq 'Magnesium' } # TODO:
141
+ specify { expect(composition.substances.size).to eq 5 }
142
+ end
143
+
144
+ context "allow substance complicated, calculated dose '6.0 +/-1.2 µg'" do
145
+ string =
146
+ "enzephalitidis japanensis virus antigenum (Stamm: SA-14-2) 6.0 +/-1.2 µg, aluminium ut aluminii oxidum hydricum, kalii dihydrogenophosphas, dinatrii phosphas anhydricus, natrii chloridum, aqua q.s. ad solutionem pro 0.5 ml"
147
+ composition = ParseComposition.from_string(string)
148
+ specify { expect(composition.substances.first.name).to eq 'Magnesii Aspartas Dihydricus' }
149
+ specify { expect(composition.substances.first.chemical_substance.name).to eq 'Magnesium' }
150
+ specify { expect(composition.substances.size).to eq 5 }
151
+ end
152
+ end if RunFailingSpec
153
+
154
+ describe ParseComposition do
155
+ context "allow 2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)" do
156
+ string = "2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)"
157
+ composition = ParseComposition.from_string(string)
158
+ specify { expect(composition.substances.first.name).to eq "2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)" }
159
+ specify { expect(composition.substances.size).to eq 1 }
160
+ end
161
+
162
+ context "allow substancename with 90 % " do
163
+ string =
164
+ "acidum nitricum 70 per centum 580.66 mg, acidum aceticum glaciale 41.08 mg, acidum oxalicum dihydricum 57.32 mg, acidum lacticum 90 % 4.55 mg, cupri(II) nitras trihydricus 0.048 mg, excipiens ad solutionem pro 1 ml"
165
+ composition = ParseComposition.from_string(string)
166
+ specify { expect(composition.substances.size).to eq 5 }
167
+ substance = composition.substances.find{ |x| /lacticum/i.match(x.name) }
168
+ specify { expect(composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum" }
169
+ specify { expect(composition.substances.first.dose.to_s).to eq "580.66 mg/ml" }
170
+ specify { expect(substance.name).to eq 'Acidum Lacticum 90 %' }
171
+ specify { expect(substance.dose.to_s).to eq '4.55 mg/ml' }
172
+ end
173
+ context "allow substance with two corresp" do
174
+ string = "magnesii aspartas dihydricus 3.895 g corresp. magnesium 292 mg corresp. 12 mmol, arom.: bergamottae aetheroleum et alia, natrii cyclamas, saccharinum natricum, excipiens ad granulatum pro charta"
175
+ composition = ParseComposition.from_string(string)
176
+ context "with correct names" do
177
+ specify { expect(composition.substances.first.name).to eq 'Magnesii Aspartas Dihydricus' }
178
+ specify { expect(composition.substances.first.chemical_substance.name).to eq 'Magnesium' }
179
+ end
180
+ specify { expect(composition.substances.size).to eq 5 }
181
+ end
182
+
183
+ context "allow substances containing ut, corresp, arom," do
184
+ string =
185
+ "calcii carbonas 3 g corresp. calcium 1.2 g, cholecalciferolum 800 U.I. ut cholecalciferoli pulvis corresp. arom.: saccharinum, natrii cyclamas et alia, excipiens pro compresso"
186
+ composition = ParseComposition.from_string(string)
187
+ specify { expect(composition.substances.size).to eq 5 }
188
+ end
189
+
190
+ context "allow substances containing 'A + '" do
191
+ string = "sennosida 20 mg corresp. sennosida A + B calcica 12 mg, excipiens pro compresso obducto"
192
+ composition = ParseComposition.from_string(string)
193
+ specify { expect(composition.substances.size).to eq 1 }
194
+ specify { expect(composition.substances.first.name).to eq 'Sennosida' }
195
+ specify { expect(composition.substances.first.chemical_substance.name).to eq 'Sennosida A + B Calcica' }
196
+ end
197
+
198
+ context "allow substances separted by ', et'" do
199
+ string = "extractum spissum ex: echinaceae purpureae herbae recentis tinctura 1140 mg, ratio: 1:12, et echinaceae purpureae radicis recentis tinctura 60 mg, ratio: 1:11, excipiens pro compresso"
200
+ composition = ParseComposition.from_string(string)
201
+ specify { expect(composition.substances.size).to eq 2 }
202
+ end
203
+
204
+ context 'find kalium 40 mmol/l' do
205
+ string = "kalium 40 mmol/l, chloridum 194 mmol/l, natrium 154 mmol/l, aqua ad iniectabilia q.s. ad solutionem pro 1000 ml"
206
+ composition = ParseComposition.from_string(string)
207
+ specify { expect(composition.substances.size).to eq 3 }
208
+ specify { expect(composition.substances.first.name).to eq 'Kalium' }
209
+ specify { expect(composition.substances.first.dose.to_s).to eq "40 mmol/l/1000 ml" }
210
+ end
211
+
212
+ context 'find corresp doses pro vase.' do
213
+ string = "farfarae folii recentis succus ratio: 1:0.68-0.95"
214
+ composition = ParseComposition.from_string(string)
215
+ specify { expect(composition.substances.size).to eq 1 }
216
+ specify { expect(composition.substances.last.name).to eq 'Farfarae Folii Recentis Succus' }
217
+ specify { expect(composition.substances.last.more_info).to eq "ratio: 1:0.68-0.95" }
218
+ end
219
+
220
+ context 'find corresp doses pro vase.' do
221
+ string = "doses pro vase 30/60"
222
+ composition = ParseComposition.from_string(string)
223
+ specify { expect( composition.substances.size).to eq 0 }
224
+ # specify { expect( composition.substances.first.name).to eq 'Doses pro Vase' } # TODO: must be found somewher eles
225
+ # specify { expect( composition.substances.first.dose.to_s).to eq '30/60' }
226
+ end
227
+
228
+ context 'find corresp. ca.' do
229
+ string = "sal ems 100 % m/m, corresp. ca., natrium 308.7 mg/g"
230
+ composition = ParseComposition.from_string(string)
231
+ specify { expect(composition.substances.size).to eq 1 }
232
+ specify { expect(composition.substances.last.name).to eq 'Sal Ems' }
233
+ end
234
+
235
+ context 'find correct result Solvens (i.m.)' do
236
+ string = "Solvens (i.v.): aqua ad iniectabilia 5 ml, corresp. 20 mg, pro 5 ml"
237
+ composition = ParseComposition.from_string(string)
238
+ specify { expect(composition.substances.first).to eq nil }
239
+ end
240
+
241
+ context 'find correct result for dose 1 Mio U.I.' do
242
+ string = "phenoxymethylpenicillinum kalicum 1 Mio U.I., conserv.: E 200, excipiens pro compresso obducto"
243
+ composition = ParseComposition.from_string(string)
244
+ specify { expect(composition.substances.size).to eq 2 }
245
+ specify { expect(composition.substances.first.name).to eq 'Phenoxymethylpenicillinum Kalicum' }
246
+ specify { expect(composition.substances.first.dose.to_s).to eq '1 Mio U.I.' }
247
+ specify { expect(composition.substances.last.name).to eq 'E 200' }
248
+ end
249
+
250
+ context 'find dose with max.' do
251
+ string = "residui: formaldehydum max. 100 µg"
252
+ composition = ParseComposition.from_string(string)
253
+ specify { expect(composition.substances.size).to eq 1 }
254
+ specify { expect(composition.substances.last.name).to eq 'Formaldehydum' }
255
+ end
256
+
257
+ context 'handle Corresp. 4000 kJ.' do
258
+ composition = ParseComposition.from_string('Corresp. 4000 kJ.')
259
+ specify { expect(composition.substances.size).to eq 0 }
260
+ specify { expect(composition.corresp).to eq '4000 kJ' }
261
+ end
262
+
263
+ context 'handle dose dose with g/dm²' do
264
+ string = 'Tela cum unguento 14 g/dm²'
265
+ composition = ParseComposition.from_string(string)
266
+ specify { expect(composition.substances.size).to eq 1 }
267
+ specify { expect(composition.substances.first.dose.to_s).to eq '14 g/dm²' }
268
+ specify { expect(composition.substances.first.name).to eq 'Tela Cum Unguento' }
269
+ end
270
+
271
+ context 'handle dose 2*10^9 CFU,' do
272
+ string = 'saccharomyces boulardii cryodesiccatus 250 mg corresp. cellulae vivae 2*10^9 CFU, excipiens pro capsula'
273
+ composition = ParseComposition.from_string(string)
274
+ specify { expect(composition.substances.size).to eq 1 }
275
+ specify { expect(composition.substances.first.chemical_substance.dose.to_s).to eq '2*10^9 CFU' }
276
+ specify { expect(composition.substances.first.name).to eq 'Saccharomyces Boulardii Cryodesiccatus' }
277
+ end
278
+
279
+ context 'handle dose followed by ratio' do
280
+ # 43996 1 Keppur, Salbe
281
+ string = "symphyti radicis recentis extractum ethanolicum liquidum 280 mg ratio: 1:3-4"
282
+ composition = ParseComposition.from_string(string)
283
+ specify { expect(composition.substances.size).to eq 1 }
284
+ specify { expect(composition.substances.first.name).to eq 'Symphyti Radicis Recentis Extractum Ethanolicum Liquidum' }
285
+ end
286
+
287
+ context 'find correct result Überzug: E 132' do
288
+ # 16863 1 Salvia Wild, Tropfen
289
+ string = "olanzapinum 15 mg, Überzug: E 132, excipiens pro compresso obducto."
290
+ composition = ParseComposition.from_string(string)
291
+ specify { expect(composition.substances.size).to eq 2 }
292
+ specify { expect(composition.substances.first.name).to eq 'Olanzapinum' }
293
+ specify { expect(composition.substances.last.name).to eq 'E 132' }
294
+ specify { expect(composition.substances.last.more_info).to eq 'Überzug' }
295
+ end
296
+
297
+ context "should handle ut followed by corresp. " do
298
+ # 65302 1 Exviera 250 mg, Filmtabletten
299
+ string = 'dasabuvirum 250 mg ut dasabuvirum natricum corresp. dasabuvirum natricum monohydricum 270.26 mg, excipiens pro compresso obducto'
300
+ composition = ParseComposition.from_string(string)
301
+ specify { expect(composition.label).to eq nil }
302
+ specify { expect(composition.label_description).to eq nil }
303
+ specify { expect(composition.substances.size).to eq 1 }
304
+ specify { expect(composition.substances.first.name).to eq 'Dasabuvirum' }
305
+ specify { expect(composition.substances.first.salts.size).to eq 1 }
306
+ specify { expect(composition.substances.first.salts.first.name).to eq 'Dasabuvirum Natricum Monohydricum' }
307
+ end
308
+
309
+ context 'find correct result for ut excipiens' do
310
+ # 16863 1 Salvia Wild, Tropfen
311
+ string = "drospirenonum 3 mg, ethinylestradiolum 20 µg ut excipiens pro compresso obducto"
312
+ composition = ParseComposition.from_string(string)
313
+ specify { expect(composition.substances.size).to eq 2 }
314
+ specify { expect(composition.substances.last.name).to eq 'Ethinylestradiolum' }
315
+ end
316
+
317
+ context 'find correct result compositions for DER: followed by corresp.' do
318
+ # 16863 1 Salvia Wild, Tropfen
319
+ string = "salviae extractum ethanolicum liquidum, DER: 1:4.2-5.0 corresp. ethanolum 40 % V/V"
320
+ composition = ParseComposition.from_string(string)
321
+ specify { expect(composition.substances.size).to eq 2 }
322
+ specify { expect(composition.substances.last.name).to eq 'DER: 1:4.2-5.0' }
323
+ end
324
+
325
+ context 'find correct result compositions for 00613 Pentavac' do
326
+ line_1 = "I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum tetani 40 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg, virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U., virus poliomyelitis typus 2 inactivatum (D-Antigen) 8 U., virus poliomyelitis typus 3 inactivatum (D-Antigen) 32 U., aluminium ut aluminii hydroxidum hydricum ad adsorptionem, formaldehydum 10 µg, conserv.: phenoxyethanolum 2.5 µl, residui: neomycinum, streptomycinum, polymyxini B sulfas, medium199, aqua q.s. ad suspensionem pro 0.5 ml."
327
+ line_2 = "II) Hib-Komponente (Lyophilisat): haemophilus influenzae Typ B polysaccharida T-conjugatum 10 µg, trometamolum, saccharum, pro praeparatione."
328
+ txt = "#{line_1}\n#{line_2}"
329
+ composition = ParseComposition.from_string(line_1)
330
+ composition = ParseComposition.from_string(line_2)
331
+ info = ParseUtil.parse_compositions(txt)
332
+
333
+ specify { expect(info.first.label).to eq 'I' }
334
+ specify { expect(info.size).to eq 2 }
335
+ specify { expect(info.first.substances.size).to eq 14 }
336
+ toxoidum = info.first.substances.find{ |x| x.name.match(/Toxoidum Diphtheriae/i) }
337
+ specify { expect(toxoidum.class).to eq Struct::ParseSubstance }
338
+ if toxoidum
339
+ specify { expect(toxoidum.name).to eq 'Toxoidum Diphtheriae' }
340
+ specify { expect(toxoidum.qty.to_f).to eq 30.0 }
341
+ specify { expect(toxoidum.unit).to eq 'U.I./0.5 ml' }
342
+ end
343
+ end
344
+
345
+ context 'find correct result compositions for fluticasoni with chemical_dose' do
346
+ string = 'fluticasoni-17 propionas 100 µg, lactosum monohydricum q.s. ad pulverem pro 25 mg.'
347
+ composition = ParseComposition.from_string(string)
348
+ specify { expect(composition.substances.size).to eq 2 }
349
+ fluticasoni = composition.substances.find{ |x| x.name.match(/Fluticasoni/i) }
350
+ specify { expect(fluticasoni.name).to eq 'Fluticasoni-17 Propionas' }
351
+ specify { expect(fluticasoni.qty.to_f).to eq 100.0 }
352
+ specify { expect(fluticasoni.unit).to eq 'µg/25 mg' }
353
+ specify { expect(fluticasoni.dose.to_s).to eq "100 µg/25 mg" }
354
+ lactosum = composition.substances.find{ |x| x.name.match(/Lactosum/i) }
355
+ specify { expect(lactosum.name).to eq "Lactosum Monohydricum" }
356
+ specify { expect(lactosum.dose.to_s).to eq "25 mg" }
357
+ end
358
+
359
+ context 'find correct result Solvens (i.m.)' do
360
+ string = "Solvens (i.m.): aqua ad iniectabilia 2 ml pro vitro"
361
+ composition = ParseComposition.from_string(string)
362
+ specify { expect(composition.substances.first.name).to eq 'aqua ad iniectabilia 2 Ml pro Vitro' }
363
+ end
364
+
365
+ context "should handle Iscador" do
366
+ # 56829 sequence 3 Iscador M
367
+ string = 'extractum aquosum liquidum fermentatum 0.05 mg ex viscum album (mali) recens 0.01 mg, natrii chloridum, aqua q.s. ad solutionem pro 1 ml.'
368
+ composition = ParseComposition.from_string(string)
369
+ viscum = composition.substances.find{ |x| x.name.match(/viscum/i) }
370
+ specify { expect(viscum.name).to eq 'Extractum Aquosum Liquidum Fermentatum 0.05 Mg Ex Viscum Album (mali) Recens' }
371
+ specify { expect(viscum.qty).to eq 0.01 } # 0.0001 mg/ml
372
+ specify { expect(viscum.unit).to eq 'mg/ml' } # 0.0001 mg/ml
373
+ specify { expect(viscum.dose.qty).to eq 0.01 } # 0.0001 mg/ml
374
+ specify { expect(viscum.dose.unit).to eq 'mg/ml' } # 0.0001 mg/ml
375
+ specify { expect(viscum.dose.to_s).to eq '0.01 mg/ml' } # 0.0001 mg/ml
376
+ specify { expect(composition.source).to eq string }
377
+ end
378
+
379
+ context 'find correct result compositions for poloxamerum' do
380
+ # 47657 1 Nanocoll, Markierungsbesteck
381
+ string = "I): albuminum humanum colloidale 0.5 mg, stanni(II) chloridum dihydricum 0.2 mg, glucosum anhydricum, dinatrii phosphas monohydricus, natrii fytas (9:1), poloxamerum 238, q.s. ad pulverem pro vitro."
382
+ composition = ParseComposition.from_string(string)
383
+ specify { expect(composition.substances.size).to eq 6 }
384
+ poloxamerum = composition.substances.find{ |x| x.name.match(/poloxamerum/i) }
385
+ skip { expect(poloxamerum.name).to eq 'Poloxamerum 238' }
386
+ skip { expect(poloxamerum.qty.to_f).to eq "" }
387
+ specify { expect(poloxamerum.unit).to eq nil }
388
+ end
389
+
390
+ context "should handle DER followed by corresp" do
391
+ # 54024 1 Nieren- und Blasendragées S
392
+ string = 'DER: 4-5:1, corresp. arbutinum 24-30 mg'
393
+ composition = ParseComposition.from_string(string)
394
+ specify { expect(composition.source).to eq string }
395
+ specify { expect(composition.label).to eq nil }
396
+ specify { expect(composition.label_description).to eq nil }
397
+ specify { expect(composition.substances.size).to eq 1 }
398
+ specify { expect(composition.substances.first.name).to eq 'DER: 4-5:1' }
399
+ specify { expect(composition.substances.first.chemical_substance.name).to eq 'Arbutinum' }
400
+ end
401
+
402
+ context "should handle 'A): macrogolum 3350 100 g'" do
403
+ # 57900 1 Moviprep, Pulver
404
+ string = 'A): macrogolum 3350 100 g, natrii sulfas anhydricus 7.5 g'
405
+ composition = ParseComposition.from_string(string)
406
+ specify { expect(composition.source).to eq string }
407
+ specify { expect(composition.label).to eq 'A' }
408
+ specify { expect(composition.label_description).to eq nil }
409
+ specify { expect(composition.substances.size).to eq 2 }
410
+ specify { expect(composition.substances.first.name).to eq 'Macrogolum 3350' }
411
+ specify { expect(composition.substances.first.qty).to eq 100 }
412
+ specify { expect(composition.substances.first.unit).to eq 'g' }
413
+ end
414
+
415
+ context "should able to handle a simple ratio" do
416
+ string = 'allii sativi maceratum oleosum 270 mg, ratio: 1:10, excipiens pro capsula.'
417
+ composition = ParseComposition.from_string(string)
418
+ specify { expect(composition.source).to eq string }
419
+ specify { expect(composition.substances.size).to eq 1 }
420
+ specify { expect(composition.substances.first.name).to eq 'Allii Sativi Maceratum Oleosum' }
421
+ specify { expect(composition.substances.first.more_info).to eq 'ratio: 1:10' }
422
+ end
423
+
424
+ context "should able to handle multiple ratio" do
425
+ # 25273 1 Schoenenberger naturreiner Heilpflanzensaft, Thymian
426
+ string = 'thymi herbae recentis extractum aquosum liquidum, ratio: 1:1.5-2.4.'
427
+ composition = ParseComposition.from_string(string)
428
+ specify { expect(composition.source).to eq string }
429
+ specify { expect(composition.substances.size).to eq 1 }
430
+ specify { expect(composition.substances.first.name).to eq 'Thymi Herbae Recentis Extractum Aquosum Liquidum' }
431
+ specify { expect(composition.substances.first.more_info).to eq 'ratio: 1:1.5-2.4' }
432
+ end
433
+
434
+ context "should handles lines containing V): mannitolum 40 mg pro dosi" do
435
+ string = 'V): mannitolum 40 mg pro dosi'
436
+ composition = ParseComposition.from_string(string)
437
+ specify { expect(composition.source).to eq string }
438
+ specify { expect(composition.label).to eq 'V' }
439
+ specify { expect(composition.substances.size).to eq 1 }
440
+ end
441
+
442
+
443
+ context "should skip lines containing I) et II)" do
444
+ skip { "should skip lines containing I) et II)"
445
+ string = 'I) et II) et III) corresp.: aminoacida 48 g/l, carbohydrata 150 g/l, materia crassa 50 g/l, in emulsione recenter mixta 1250 ml'
446
+ composition = ParseComposition.from_string(string)
447
+ specify { expect(composition.source).to eq string }
448
+ specify { expect(composition.substances.size).to eq 0 }
449
+ }
450
+ end
451
+
452
+ context "should treat correctly CFU units" do
453
+ # 56015 Perskindol Cool avec consoude, gel
454
+ string = 'lactobacillus acidophilus cryodesiccatus min. 10^9 CFU'
455
+ composition = ParseComposition.from_string(string)
456
+ specify { expect(composition.substances.first.name).to eq 'Lactobacillus Acidophilus Cryodesiccatus' }
457
+ specify { expect(composition.substances.first.qty).to eq '10^9' }
458
+ specify { expect(composition.substances.first.unit).to eq 'CFU' }
459
+ end
460
+
461
+ context "should pass several () inside a name" do
462
+ composition = nil
463
+ strings = [
464
+ 'a(eine klammer) und nachher',
465
+ '(eine klammer) und nachher',
466
+ 'haemagglutininum influenzae A (eine klammer)' ,
467
+ 'haemagglutininum influenzae A (eine klammer) und nachher' ,
468
+ 'haemagglutininum influenzae A (H1N1) (in Klammer)' ,
469
+ 'haemagglutininum influenzae A (H1N1) or (H5N3) (in Klammer) more' ,
470
+ 'haemagglutininum influenzae A (H1N1) eins (second) even more' ,
471
+ 'ab (H1N1)-like: dummy',
472
+ 'Virus-Stamm A/California/7/2009 (H1N1)-like: reassortant virus NYMC X-179A',
473
+ 'haemagglutininum influenzae A (H1N1) (Virus-Stamm A/California/7/2009 (H1N1)-like: reassortant virus NYMC X-179A)',
474
+ ].each { |string|
475
+ composition = ParseComposition.from_string(string)
476
+ }
477
+ composition = ParseComposition.from_string(strings.last + ' 15 µg')
478
+ specify { expect(composition.substances.first.name.downcase).to eq strings.last.downcase }
479
+ specify { expect(composition.substances.first.qty).to eq 15 }
480
+ specify { expect(composition.substances.first.unit).to eq 'µg' }
481
+ end
482
+
483
+ context "should emit correct unit when excipiens contains pro X ml" do
484
+ string = 'glatiramerum acetas 20 mg corresp. glatiramerum 18 mg, mannitolum, aqua ad iniectabilia q.s. ad solutionem pro 0.5 ml.'
485
+ composition = ParseComposition.from_string(string)
486
+ specify { expect(composition.substances.first.name).to eq 'Glatiramerum Acetas' }
487
+ specify { expect(composition.substances.first.qty).to eq 20 }
488
+ specify { expect(composition.substances.first.unit).to eq 'mg/0.5 ml' }
489
+ specify { expect(composition.substances.first.chemical_substance.unit).to eq 'mg/0.5 ml' }
490
+ specify { expect(composition.substances.first.chemical_substance.name).to eq 'Glatiramerum' }
491
+ specify { expect(composition.substances.first.chemical_substance.qty).to eq 18 }
492
+ specify { expect(composition.substances.first.chemical_substance.unit).to eq 'mg/0.5 ml' }
493
+ end
494
+
495
+ context "should handle substance with a range" do
496
+ string = 'glyceroli monostearas 40-55'
497
+ composition = ParseComposition.from_string(string)
498
+ specify { expect(composition.substances.size).to eq 1 }
499
+ specify { expect(composition.substances.first.name).to eq 'Glyceroli Monostearas' }
500
+ specify { expect(composition.substances.first.dose.to_s).to eq '40-55' }
501
+ end
502
+
503
+ context "should handle mineralia with alia" do
504
+ string = 'mineralia: calcium 160 ut alia: ginseng extractum 50 mg'
505
+ composition = ParseComposition.from_string(string)
506
+ specify { expect(composition.substances.size).to eq 2 }
507
+ specify { expect(composition.substances.first.salts.size).to eq 0 }
508
+ specify { expect(composition.substances.first.name).to eq 'Calcium' } # TODO:
509
+ specify { expect(composition.substances.last.name).to eq 'Ginseng Extractum' } # TODO:
510
+ # TODO: specify { expect(composition.substances.first.dose.to_s).to eq '9 g/L 5 ml' }
511
+ end
512
+
513
+ context "should handle mineralia" do
514
+ string = 'mineralia: calcium 160 mg ut magnesium 120 mg ut ferrum 5.6 mg ut cuprum 1 mg ut manganum 1.4 mg ut iodum 60 µg ut molybdenum 60 µg'
515
+ composition = ParseComposition.from_string(string)
516
+ specify { expect(composition.substances.size).to eq 1 }
517
+ specify { expect(composition.substances.first.more_info).to eq "mineralia" }
518
+ specify { expect(composition.substances.first.salts.size).to eq 6 }
519
+ specify { expect(composition.substances.first.salts.first.name).to eq 'Magnesium' }
520
+ specify { expect(composition.substances.first.salts.first.qty).to eq 120.0 }
521
+ specify { expect(composition.substances.first.salts.first.unit).to eq 'mg' }
522
+ specify { expect(composition.substances.first.name).to eq 'Calcium' } # TODO:
523
+ # TODO: specify { expect(composition.substances.first.dose.to_s).to eq '9 g/L 5 ml' }
524
+ end
525
+
526
+ context "should handle solvens" do
527
+ string = 'Solvens: natrii chloridi solutio 9 g/L 5 ml.'
528
+ composition = ParseComposition.from_string(string)
529
+ specify { expect(composition.substances.size).to eq 1 }
530
+ specify { expect(composition.substances.first.more_info).to eq "Solvens" }
531
+ specify { expect(composition.substances.first.name).to eq 'Natrii Chloridi Solutio 9 G/l 5 Ml' } # TODO:
532
+ # TODO: specify { expect(composition.substances.first.dose.to_s).to eq '9 g/L 5 ml' }
533
+ end
534
+
535
+ context "should parse a complex composition" do
536
+ string = 'globulina equina (immunisé avec coeur) 8 mg'
537
+ string = 'globulina equina (immunisé avec coeur, tissu pulmonaire, reins de porcins) 8 mg'
538
+ composition = ParseComposition.from_string(string)
539
+ specify { expect(composition.substances.size).to eq 1 }
540
+ globulina = composition.substances.find{ |x| /globulina/i.match(x.name) }
541
+ specify { expect(globulina.name).to eq 'Globulina Equina (immunisé Avec Coeur, Tissu Pulmonaire, Reins De Porcins)' }
542
+ end
543
+
544
+ context "should return correct composition for containing '(acarus siro)" do
545
+ string = "acari allergeni extractum (acarus siro) 50'000 U., conserv.: phenolum, excipiens ad solutionem pro 1 ml."
546
+ composition = ParseComposition.from_string(string)
547
+ specify { expect(composition.source).to eq string }
548
+ specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 3 : 2 } # got only 1
549
+ specify { expect(composition.substances.first.more_info).to eq nil }
550
+ specify { expect(composition.substances.first.name).to eq 'Acari Allergeni Extractum (acarus Siro)' }
551
+ specify { expect(composition.substances.last.name).to eq 'Phenolum' } # was Acari Allergeni Extractum (acarus Siro)
552
+ specify { expect(composition.substances.last.more_info).to match 'conserv' }
553
+ end
554
+
555
+ context "should return correct composition for containing 'A): acari allergeni extractum 50 U' (IKSNR 60606)" do
556
+ # Novo-Helisen Depot D. farinae/D. pteronyssinus Kombipackung 1-3, Injektionssuspension
557
+ string =
558
+ 'A): acari allergeni extractum 50 U.: dermatophagoides farinae 50 % et dermatophagoides pteronyssinus 50 %, aluminium ut aluminii hydroxidum hydricum ad adsorptionem, natrii chloridum, conserv.: phenolum 4.0 mg, aqua q.s. ad suspensionem pro 1 ml.'
559
+ composition = ParseComposition.from_string(string)
560
+ composition.label_description
561
+ specify { expect(composition.label).to eq "A" }
562
+ specify { expect(composition.label_description).to eq "acari allergeni extractum 50 U." }
563
+ specify { expect(composition.source).to eq string }
564
+ specify { expect(composition.substances.size).to eq 5 }
565
+ pteronyssinus = composition.substances.find{ |x| /pteronyssinus/i.match(x.name) }
566
+ specify { expect(composition.substances.first.name).to eq 'Dermatophagoides Farinae' }
567
+ specify { expect(pteronyssinus.name).to eq 'Dermatophagoides Pteronyssinus' }
568
+ specify { expect(pteronyssinus.more_info).to eq nil }
569
+ end
570
+
571
+ context "should return correct composition for containing 'virus rabiei inactivatum" do
572
+ string = 'Praeparatio cryodesiccata: virus rabiei inactivatum (Stamm: Wistar Rabies PM/WI 38-1503-3M) min. 2.5 U.I.'
573
+ composition = ParseComposition.from_string(string)
574
+ specify { expect(composition.source).to eq string }
575
+ specify { expect(composition.substances.size).to eq 1 }
576
+ specify { expect(composition.substances.first.name).to eq "Virus Rabiei Inactivatum (stamm: Wistar Rabies Pm/wi 38-1503-3m)" }
577
+ specify { expect(composition.substances.first.qty).to eq 2.5 }
578
+ specify { expect(composition.substances.first.unit).to eq 'U.I.' }
579
+ specify { expect(composition.label).to eq "Praeparatio cryodesiccata:" }
580
+ end
581
+
582
+ context "should return correct composition for containing Histamin Equivalent Pric. (e.g IKSNR 58566)" do
583
+ # 58566 1 Soluprick SQ Phleum pratense, Lösung
584
+ string = 'pollinis allergeni extractum (Phleum pratense) 10 U., natrii chloridum, phenolum, glycerolum, aqua ad iniectabilia q.s. ad solutionem pro 1 ml, U = Histamin Equivalent Prick.'
585
+ composition = ParseComposition.from_string(string)
586
+ specify { expect(composition.source).to eq string }
587
+ specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 5 : 4 }
588
+ specify { expect(composition.substances.first.name).to eq 'Pollinis Allergeni Extractum (phleum Pratense)' }
589
+ end
590
+
591
+ if RunExcipiensTest
592
+ context "should handle aqua ad iniectabilia" do
593
+ string = "aqua ad iniectabilia q.s. ad solutionem pro 5 ml"
594
+ composition = ParseComposition.from_string(string)
595
+ substance = composition.substances.first
596
+ if ExcipiensIs_a_Substance
597
+ specify { expect(substance.name).to eq 'aqua ad iniectabilia q.s. ad solutionem' }
598
+ specify { expect(substance.chemical_substance).to eq nil }
599
+ specify { expect(substance.qty).to eq 5.0}
600
+ specify { expect(substance.unit).to eq 'ml' }
601
+ else
602
+ specify { expect(substance).to eq nil }
603
+ end
604
+ end
605
+
606
+ context "should return correct substance for 'excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V'" do
607
+ string = "excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V"
608
+ composition = ParseComposition.from_string(string)
609
+ substance = composition.substances.first
610
+ if ExcipiensIs_a_Substance
611
+ # TODO: what should we report here? dose = pro 1 ml or 59.5 % V/V, chemical_substance = ethanolum?
612
+ # or does it only make sense as part of a composition?
613
+ specify { expect(substance.name).to eq 'Ethanolum' }
614
+ specify { expect(substance.cdose).to eq nil }
615
+ specify { expect(substance.qty).to eq 59.5}
616
+ specify { expect(substance.unit).to eq '% V/V' }
617
+ else
618
+ specify { expect(substance).to eq nil }
619
+ end
620
+ end
621
+
622
+ context "should return correct composition for 'excipiens ad emulsionem'" do
623
+ string = 'excipiens ad emulsionem pro 1 g"'
624
+ composition = ParseComposition.from_string(string)
625
+ substance = composition.substances.first
626
+ if ExcipiensIs_a_Substance
627
+ specify { expect(composition.source).to eq string }
628
+ specify { expect(composition.substances.size).to eq 0 }
629
+ else
630
+ specify { expect(substance).to eq nil }
631
+ end
632
+ end
633
+
634
+ context "should return correct substance for 'excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V'" do
635
+ string = "excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V"
636
+ composition = ParseComposition.from_string(string)
637
+ substance = composition.substances.first
638
+ if ExcipiensIs_a_Substance
639
+ specify { expect(substance.name).to eq 'Excipiens' }
640
+ specify { expect(substance.chemical_substance.name).to eq 'Ethanolum' }
641
+ specify { expect(substance.cdose.to_s).to eq ParseDose.new('59.5', '% V/V').to_s }
642
+ specify { expect(substance.qty).to eq 1.0}
643
+ specify { expect(substance.unit).to eq 'ml' }
644
+ else
645
+ specify { expect(substance).to eq nil }
646
+ end
647
+ end
648
+
649
+ context "should return correct substance for 'aqua q.s. ad suspensionem pro 0.5 ml'" do
650
+ string = "aqua q.s. ad suspensionem pro 0.5 ml"
651
+ composition = ParseComposition.from_string(string)
652
+ if ExcipiensIs_a_Substance
653
+ substance = composition.substances.first
654
+ specify { expect(substance.name).to eq 'aqua q.s. ad suspensionem' }
655
+ specify { expect(substance.qty).to eq 0.5}
656
+ specify { expect(substance.unit).to eq 'ml' }
657
+ else
658
+ specify { expect(substance).to eq nil }
659
+ end
660
+ end
661
+
662
+ context "should return correct substance for 'excipiens ad solutionem pro 3 ml corresp. 50 µg'" do
663
+ string = "excipiens ad solutionem pro 3 ml corresp. 50 µg"
664
+ composition = ParseComposition.from_string(string)
665
+ substance = composition.substances.first
666
+ if ExcipiensIs_a_Substance
667
+ specify { expect(substance.name).to eq 'Excipiens' }
668
+ specify { expect(substance.qty).to eq 3.0}
669
+ specify { expect(substance.unit).to eq 'ml' }
670
+ specify { expect(substance.cdose.qty).to eq 50.0}
671
+ specify { expect(substance.cdose.unit).to eq 'µg' }
672
+ else
673
+ specify { expect(substance).to eq nil}
674
+ end
675
+ end
676
+
677
+ context "should return correct substance for 'excipiens ad pulverem pro 1000 mg'" do
678
+ string = "excipiens ad pulverem pro 1000 mg"
679
+ CompositionTransformer.clear_substances
680
+ composition = ParseComposition.from_string(string)
681
+ substance = composition.substances.first
682
+ if ExcipiensIs_a_Substance
683
+ specify { expect(substance.name).to eq 'Excipiens' }
684
+ specify { expect(substance.qty).to eq 1000.0 }
685
+ specify { expect(substance.unit).to eq 'mg' }
686
+ else
687
+ specify { expect(substance).to eq nil }
688
+ end
689
+ end
690
+ end
691
+ context "should pass with 'etinoli 7900 U.I'" do
692
+ string = "retinoli 7900 U.I."
693
+ composition = ParseComposition.from_string(string)
694
+ specify { expect(composition.source).to eq string }
695
+ specify { expect(composition.substances.size).to eq 1 }
696
+ specify { expect(composition.substances.first.qty).to eq 7900.0 }
697
+ specify { expect(composition.substances.first.unit).to eq 'U.I.' }
698
+ specify { expect(composition.substances.first.name).to eq 'Retinoli' }
699
+ end
700
+
701
+ context "should return correct composition for containing 'absinthii herba 1.2 g pro charta" do
702
+ string = "absinthii herba 1.2 g pro charta"
703
+ composition = ParseComposition.from_string(string)
704
+ specify { expect(composition.source).to eq string }
705
+ specify { expect(composition.substances.size).to eq 1 }
706
+ specify { expect(composition.substances.first.name).to eq 'Absinthii Herba' }
707
+ end
708
+
709
+ context "should return correct composition for containing 'ad pulverem'" do
710
+ string = "pimpinellae radix 15 % ad pulverem"
711
+ composition = ParseComposition.from_string(string)
712
+ specify { expect(composition.source).to eq string }
713
+ specify { expect(composition.substances.size).to eq 1 }
714
+ specify { expect(composition.substances.first.name).to eq 'Pimpinellae Radix' }
715
+ end
716
+
717
+ context "should return correct composition for 'DER: 6:1'" do
718
+ string = "DER: 6:1"
719
+ composition = ParseComposition.from_string(string)
720
+ specify { expect(composition.source).to eq string }
721
+ specify { expect(composition.substances.size).to eq 1 }
722
+ specify { expect(composition.substances.first.name).to eq string }
723
+ end
724
+
725
+ context "should return correct composition for containing ' ut procaini hydrochloridum" do
726
+ string =
727
+ 'procainum 10 mg ut procaini hydrochloridum'
728
+ composition = ParseComposition.from_string(string)
729
+ specify { expect(composition.source).to eq string }
730
+ specify { expect(composition.substances.size).to eq 1 }
731
+ specify { expect(composition.substances.first.name).to eq 'Procainum' }
732
+ specify { expect(composition.substances.first.salts.first.name).to eq 'Procaini Hydrochloridum' }
733
+ end
734
+
735
+ context "should return correct composition for containing 'ad pulverem'" do
736
+ string =
737
+ #"absinthii herba 15 %, anisi fructus 15 %, carvi fructus 15 %, foeniculi fructus 15 %, iuniperi pseudofructus 10 %, millefolii herba 15 %, pimpinellae radix 15 % ad pulverem.\n"
738
+ "pimpinellae radix 15 % ad pulverem.\n"
739
+ composition = ParseComposition.from_string(string)
740
+ specify { expect(composition.source).to eq string }
741
+ specify { expect(composition.substances.size).to eq 1 }
742
+ specify { expect(composition.substances.first.name).to eq 'Pimpinellae Radix' }
743
+ specify { expect(composition.substances.first.qty).to eq 15.0 }
744
+ specify { expect(composition.substances.first.unit).to eq '%' }
745
+ end
746
+
747
+ context "should return correct composition for containing 'excipiens ad globulos" do
748
+ string =
749
+ "abrus precatorius C6, aconitum napellus C6, atropa belladonna C6, calendula officinalis C6, chelidonium majus C6, viburnum opulus C6 ana partes, excipiens ad globulos.\n"
750
+ composition = ParseComposition.from_string(string)
751
+ specify { expect(composition.source).to eq string }
752
+ specify { expect(composition.substances.size).to eq 6 }
753
+ specify { expect(composition.substances.first.name).to eq 'Abrus Precatorius C6' }
754
+ end
755
+
756
+ context "should return correct composition for containing 'arom.: E 104'" do
757
+ string = 'gentianae radix 12 mg, primulae flos 36 mg, rumicis acetosae herba 36 mg, sambuci flos 36 mg, verbenae herba 36 mg, color.: E 104 et E 132, excipiens pro compresso obducto.'
758
+ composition = ParseComposition.from_string(string)
759
+ specify { expect(composition.source).to eq string }
760
+ specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 8 : 7 }
761
+ e104 = composition.substances.find{ |x| x.name.eql?('E 104') }
762
+
763
+ specify { expect(e104.name).to eq 'E 104' }
764
+ specify { expect(composition.substances.first.name).to eq 'Gentianae Radix' }
765
+ end
766
+
767
+ context "should return correct composition for containing 'color.: E 160(a)'" do
768
+ string = 'color.: E 160(a), E 171'
769
+ composition = ParseComposition.from_string(string)
770
+ specify { expect(composition.source).to eq string }
771
+ specify { expect(composition.substances.size).to eq 2 }
772
+ specify { expect(composition.substances.first.name).to eq 'E 160(a)' }
773
+ specify { expect(composition.substances.last.name).to eq 'E 171' }
774
+ end
775
+
776
+
777
+ if RunMostImportantParserTests
778
+
779
+ context "should parse a Praeparatio with a label/galenic form?" do
780
+ string = "Praeparatio cryodesiccata: pollinis allergeni extractum 25'000 U.: urtica dioica"
781
+ composition = ParseComposition.from_string(string)
782
+ substance = composition.substances.first
783
+ # specify { expect(substance.name).to eq 'Urtica Dioica' } # TODO: is this okay?
784
+ specify { expect(composition.label).to eq 'Praeparatio cryodesiccata:' }
785
+ end
786
+
787
+ context "should return correct substance for equis F(ab')2" do
788
+ string = "viperis antitoxinum equis F(ab')2"
789
+ composition = ParseComposition.from_string(string)
790
+ substance = composition.substances.first
791
+ specify { expect(substance.name).to eq "Viperis Antitoxinum Equis F(ab')" }
792
+ end
793
+
794
+ context "should return correct substance for with two et substances corresp" do
795
+ string = "viperis antitoxinum equis F(ab')2 corresp. Vipera aspis > 1000 LD50 mus et Vipera berus > 500 LD50 mus et Vipera ammodytes > 1000 LD50 mus"
796
+ composition = ParseComposition.from_string(string)
797
+ substance = composition.substances.last
798
+ specify { expect(substance.name).to eq "Vipera Ammodytes > 1000 Ld50 Mus" }
799
+ end
800
+
801
+ context "should return correct substance for 'pyrazinamidum 500 mg'" do
802
+ string = "pyrazinamidum 500 mg"
803
+ CompositionTransformer.clear_substances
804
+ composition = ParseComposition.from_string(string)
805
+ substance = composition.substances.first
806
+ specify { expect(substance.name).to eq 'Pyrazinamidum' }
807
+ specify { expect(substance.qty).to eq 500.0 }
808
+ specify { expect(substance.unit).to eq 'mg' }
809
+ end
810
+
811
+ context "should return correct substance for given with et and corresp. (IKSNR 11879)" do
812
+ string = "calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg corresp. calcium 100 mg"
813
+
814
+ composition = ParseComposition.from_string(string)
815
+ specify { expect(composition.substances.size).to eq 2 }
816
+ calcii = composition.substances.find{ |x| /calcii/i.match(x.name) }
817
+ pentahydricus = composition.substances.find{ |x| /pentahydricus/i.match(x.name) }
818
+ anhydricus = composition.substances.find{ |x| /anhydricus/i.match(x.name) }
819
+ specify { expect(pentahydricus.name).to eq 'Calcii Lactas Pentahydricus' }
820
+ specify { expect(pentahydricus.qty).to eq 25.0}
821
+ specify { expect(pentahydricus.unit).to eq 'mg' }
822
+ specify { expect(anhydricus.name).to eq 'Calcii Hydrogenophosphas Anhydricus' }
823
+ specify { expect(anhydricus.qty).to eq 300.0 }
824
+ specify { expect(anhydricus.unit).to eq 'mg' }
825
+ specify { expect(anhydricus.chemical_substance.name).to eq 'Calcium' }
826
+ specify { expect(anhydricus.chemical_substance.qty).to eq 100.0 }
827
+ specify { expect(anhydricus.chemical_substance.unit).to eq 'mg' }
828
+ end
829
+
830
+ context "should return correct substances for Nutriflex IKSNR 42847" do
831
+ string = "I) Glucoselösung: glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.
832
+ .
833
+ II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g, lysinum anhydricum 3.98 g ut lysinum monohydricum, methioninum 3.42 g, phenylalaninum 6.15 g, threoninum 3.18 g, tryptophanum 1 g, valinum 4.54 g, argininum 4.73 g, histidinum 2.19 g ut histidini hydrochloridum monohydricum, alaninum 8.49 g, acidum asparticum 2.63 g, acidum glutamicum 6.14 g, glycinum 2.89 g, prolinum 5.95 g, serinum 5.25 g, mineralia: magnesii acetas tetrahydricus 1.08 g, natrii acetas trihydricus 1.63 g, kalii dihydrogenophosphas 2 g, kalii hydroxidum 620 mg, natrii hydroxidum 1.14 g, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.
834
+ .
835
+ I) et II) corresp.: aminoacida 70 g, nitrogenia 10 g, natrium 40.5 mmol, kalium 25.7 mmol, calcium 4.1 mmol, magnesium 5 mmol, chloridum 49.5 mmol, phosphas 14.7 mmol, acetas 22 mmol, in solutione recenter reconstituta 1000 ml.
836
+ Corresp. 5190 kJ pro 1 l."
837
+ line_1 = "I) Glucoselösung: glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml."
838
+ line_2 = "."
839
+ line_3 = "II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g, lysinum anhydricum 3.98 g ut lysinum monohydricum, methioninum 3.42 g, phenylalaninum 6.15 g, threoninum 3.18 g, tryptophanum 1 g, valinum 4.54 g, argininum 4.73 g, histidinum 2.19 g ut histidini hydrochloridum monohydricum, alaninum 8.49 g, acidum asparticum 2.63 g, acidum glutamicum 6.14 g, glycinum 2.89 g, prolinum 5.95 g, serinum 5.25 g, mineralia: magnesii acetas tetrahydricus 1.08 g, natrii acetas trihydricus 1.63 g, kalii dihydrogenophosphas 2 g, kalii hydroxidum 620 mg, natrii hydroxidum 1.14 g, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml."
840
+ line_4 = "."
841
+ line_5 = "I) et II) corresp.: aminoacida 70 g, nitrogenia 10 g, natrium 40.5 mmol, kalium 25.7 mmol, calcium 4.1 mmol, magnesium 5 mmol, chloridum 49.5 mmol, phosphas 14.7 mmol, acetas 22 mmol, in solutione recenter reconstituta 1000 ml."
842
+ line_6 = "Corresp. 5190 kJ pro 1 l."
843
+ tst = 'glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg, acidum citricum monohydricum'
844
+ tst2 = 'glucosum anhydricum 240 g ut glucosum monohydricum, calcii chloridum dihydricum 600 mg'
845
+ tst_ut = 'glucosum anhydricum 240 g ut glucosum monohydricum'
846
+ composition = ParseComposition.from_string(line_2)
847
+ line_3 = "II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g, lysinum anhydricum 3.98 g ut lysinum monohydricum, methioninum 3.42 g, phenylalaninum 6.15 g, threoninum 3.18 g, tryptophanum 1 g, valinum 4.54 g, argininum 4.73 g, histidinum 2.19 g ut histidini hydrochloridum monohydricum, alaninum 8.49 g, acidum asparticum 2.63 g, acidum glutamicum 6.14 g, glycinum 2.89 g, prolinum 5.95 g, serinum 5.25 g, mineralia: magnesii acetas tetrahydricus 1.08 g, natrii acetas trihydricus 1.63 g, kalii dihydrogenophosphas 2 g, kalii hydroxidum 620 mg, natrii hydroxidum 1.14 g, acidum citricum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml."
848
+ line_3 = "II) Aminosäurelösung: aminoacida: isoleucinum 4.11 g, leucinum 5.48 g"
849
+ line_3 = "aminoacida: isoleucinum 4.11 g, leucinum 5.48 g"
850
+ composition = ParseComposition.from_string(line_3)
851
+ composition = ParseComposition.from_string(line_1)
852
+
853
+ composition = ParseComposition.from_string(line_1)
854
+ specify { expect(composition.substances.size).to eq 3}
855
+ specify { expect(composition.label).to eq 'I' }
856
+ specify { expect(composition.label_description).to eq 'Glucoselösung' }
857
+ dihydricum = composition.substances.find{ |x| /dihydricum/i.match(x.name) }
858
+ monohydricum = composition.substances.find{ |x| /monohydricum/i.match(x.name) }
859
+
860
+ specify { expect(dihydricum.name).to eq 'Calcii Chloridum Dihydricum' }
861
+ specify { expect(dihydricum.chemical_substance).to eq nil }
862
+ specify { expect(dihydricum.qty).to eq 600.0}
863
+ specify { expect(dihydricum.unit).to eq 'mg/500 ml' }
864
+
865
+ specify { expect(monohydricum.name).to eq 'Acidum Citricum Monohydricum' }
866
+ specify { expect(monohydricum.chemical_substance).to eq nil }
867
+ specify { expect(monohydricum.cdose).to eq nil }
868
+ specify { expect(monohydricum.qty).to eq nil}
869
+ specify { expect(monohydricum.unit).to eq nil }
870
+ end
871
+
872
+ context "should return correct substance for 9,11-linolicum " do
873
+ substance = nil; composition = nil
874
+ [ "9,11-linolicum",
875
+ "9,11-linolicum 3.25 mg"
876
+ ].each {
877
+ |string|
878
+ composition = ParseComposition.from_string(string)
879
+ substance = composition.substances.first
880
+ specify { expect(substance.name).to eq '9,11-linolicum' }
881
+ specify { expect(substance.chemical_substance).to eq nil }
882
+ CompositionTransformer.clear_substances
883
+ composition = ParseComposition.from_string(string)
884
+ }
885
+
886
+ specify { expect(substance.qty).to eq 3.25}
887
+ specify { expect(substance.unit).to eq 'mg' }
888
+ end
889
+
890
+ context "should return correct substance ut (IKSNR 44744)" do
891
+ string = "zuclopenthixolum 2 mg ut zuclopenthixoli dihydrochloridum, excipiens pro compresso obducto."
892
+ composition = ParseComposition.from_string(string)
893
+ specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 2 : 1}
894
+ specify { expect(composition.substances.first.name).to eq 'Zuclopenthixolum' }
895
+ specify { expect(composition.substances.first.qty).to eq 2.0}
896
+ specify { expect(composition.substances.first.salts.size).to eq 1}
897
+ if composition.substances.first
898
+ salt = composition.substances.first.salts.first
899
+ specify { expect(salt.name).to eq 'Zuclopenthixoli Dihydrochloridum' }
900
+ specify { expect(salt.qty).to eq nil}
901
+ specify { expect(salt.unit).to eq nil }
902
+ end
903
+ end
904
+
905
+ context "should return correct substance for given with et (IKSNR 11879)" do
906
+ string = "calcii lactas pentahydricus 25 mg et calcii hydrogenophosphas anhydricus 300 mg"
907
+ composition = ParseComposition.from_string(string)
908
+ specify { expect(composition.substances.size).to eq 2 }
909
+ pentahydricus = composition.substances.find{ |x| /pentahydricus/i.match(x.name) }
910
+ anhydricus = composition.substances.find{ |x| /anhydricus/i.match(x.name) }
911
+ specify { expect(pentahydricus.name).to eq 'Calcii Lactas Pentahydricus' }
912
+ specify { expect(pentahydricus.qty).to eq 25.0}
913
+ specify { expect(pentahydricus.unit).to eq 'mg' }
914
+ specify { expect(anhydricus.name).to eq 'Calcii Hydrogenophosphas Anhydricus' }
915
+ specify { expect(anhydricus.qty).to eq 300.0 }
916
+ specify { expect(anhydricus.unit).to eq 'mg' }
917
+ end
918
+
919
+ context "should return correct substance for 'Xenonum(133-xe) 74 -740 Mb'" do
920
+ string = "Xenonum(133-Xe) 74 -740 MBq"
921
+ composition = ParseComposition.from_string(string)
922
+ substance = composition.substances.first
923
+ specify { expect(substance.name).to eq 'Xenonum(133-xe)' }
924
+ specify { expect(substance.qty).to eq '74-740' }
925
+ specify { expect(substance.unit).to eq 'MBq' }
926
+ end
927
+
928
+ context "should return correct substance for 'pyrazinamidum'" do
929
+ string = "pyrazinamidum"
930
+ composition = ParseComposition.from_string(string)
931
+ substance = composition.substances.first
932
+ specify { expect(substance.name).to eq 'Pyrazinamidum' }
933
+ specify { expect(substance.qty).to eq nil }
934
+ specify { expect(substance.unit).to eq nil }
935
+ end
936
+
937
+ context "should return correct substance for 'E 120'" do
938
+ string = "E 120"
939
+ composition = ParseComposition.from_string(string)
940
+ substance = composition.substances.first
941
+ specify { expect(substance.name).to eq string }
942
+ specify { expect(substance.qty).to eq nil }
943
+ specify { expect(substance.unit).to eq nil }
944
+ end
945
+
946
+ context "should return correct substance for 'retinoli palmitas 7900 U.I.'" do
947
+ string = "retinoli palmitas 7900 U.I."
948
+ composition = ParseComposition.from_string(string)
949
+ substance = composition.substances.first
950
+ specify { expect(substance.name).to eq 'Retinoli Palmitas' }
951
+ specify { expect(substance.qty).to eq 7900.0}
952
+ specify { expect(substance.unit).to eq 'U.I.' }
953
+ end
954
+
955
+ context "should return correct substance for 'toxoidum pertussis 8 µg'" do
956
+ string = "toxoidum pertussis 8 µg"
957
+ composition = ParseComposition.from_string(string)
958
+ substance = composition.substances.first
959
+ specify { expect(substance.name).to eq 'Toxoidum Pertussis' }
960
+ specify { expect(substance.qty).to eq 8.0}
961
+ specify { expect(substance.unit).to eq 'µg' }
962
+ end
963
+
964
+ end
965
+
966
+ context "should return correct substance Rote Filmtablett 54819 Beriplast" do
967
+ string = "A) Rote Filmtablette: estradiolum 1 mg ut estradiolum hemihydricum, excipiens pro compresso obducto"
968
+ string = "estradiolum 1 mg ut estradiolum hemihydricum, excipiens pro compresso obducto"
969
+ composition = ParseComposition.from_string(string)
970
+ substance = composition.substances.first
971
+ specify { expect(composition.substances.size).to eq 1 }
972
+ # specify { expect(composition.substances.last.name).to eq 'Obducto' }
973
+ specify { expect(substance.name).to eq 'Estradiolum' }
974
+ specify { expect(composition.substances.first.salts.first.name).to eq 'Estradiolum Hemihydricum' }
975
+ specify { expect(substance.cdose.to_s).to eq "" }
976
+ specify { expect(substance.qty).to eq 1.0}
977
+ specify { expect(substance.unit).to eq 'mg' }
978
+ end
979
+
980
+ context "should return correct composition for containing ut IKSNR 613" do
981
+ string = 'aluminium ut aluminii hydroxidum hydricum ad adsorptionem'
982
+ composition = ParseComposition.from_string(string)
983
+ specify { expect(composition.source).to eq string }
984
+ specify { expect(composition.label).to eq nil }
985
+ specify { expect(composition.substances.size).to eq 1 }
986
+ specify { expect(composition.substances.first.name).to eq 'Aluminium' }
987
+ specify { expect(composition.substances.first.salts.first.name).to eq 'Aluminii Hydroxidum Hydricum Ad Adsorptionem' }
988
+ end
989
+
990
+ context "should return correct substance for 'toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg'" do
991
+ string = "toxoidum pertussis 25 µg et haemagglutininum filamentosum 15 µg"
992
+ composition = ParseComposition.from_string(string)
993
+ toxoidum = composition.substances.first
994
+ specify { expect(toxoidum.name).to eq 'Toxoidum Pertussis' }
995
+ specify { expect(toxoidum.qty).to eq 25.0}
996
+ specify { expect(toxoidum.unit).to eq 'µg' }
997
+ specify { expect(toxoidum.chemical_substance).to eq nil }
998
+ haemagglutininum = composition.substances.last
999
+ specify { expect(haemagglutininum.name).to eq 'Haemagglutininum Filamentosum' }
1000
+ specify { expect(haemagglutininum.qty).to eq 15.0}
1001
+ specify { expect(haemagglutininum.unit).to eq 'µg' }
1002
+ end
1003
+
1004
+ if RunSpecificTests
1005
+ context "should return correct composition for containing parenthesis in substance name abd 40 U. (e.g IKSNR 613)" do
1006
+ string = 'virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U.'
1007
+ composition = ParseComposition.from_string(string)
1008
+ specify { expect(composition.source).to eq string }
1009
+ specify { expect(composition.substances.size).to eq 1 }
1010
+ specify { expect(composition.substances.first.name).to eq 'Virus Poliomyelitis Typus 1 Inactivatum (d-antigen)' }
1011
+ end
1012
+
1013
+ context "should return correct composition for containing parenthesis in substance name (e.g IKSNR 613)" do
1014
+ string = 'virus poliomyelitis typus inactivatum (D-Antigen)'
1015
+ string = 'virus poliomyelitis typus 1 inactivatum (d-antigen)'
1016
+ composition = ParseComposition.from_string(string)
1017
+ specify { expect(composition.source).to eq string }
1018
+ specify { expect(composition.substances.size).to eq 1 }
1019
+ specify { expect(composition.substances.first.name).to eq 'Virus Poliomyelitis Typus 1 Inactivatum (d-antigen)' }
1020
+ end
1021
+
1022
+ context "should return correct composition for containing residui (e.g IKSNR 613)" do
1023
+ string = 'residui: neomycinum, streptomycinum'
1024
+ composition = ParseComposition.from_string(string)
1025
+ specify { expect(composition.source).to eq string }
1026
+ specify { expect(composition.substances.size).to eq 2 }
1027
+ specify { expect(composition.substances.first.more_info).to eq 'residui' }
1028
+ specify { expect(composition.substances.first.name).to eq 'Neomycinum' }
1029
+ specify { expect(composition.substances.last.name).to eq 'Streptomycinum' }
1030
+ end
1031
+
1032
+ context "should return correct composition for 'conserv.: E 217, E 219' IKSNR 613" do
1033
+ # string = 'I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum tetani 40 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg, virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U., virus poliomyelitis typus 2 inactivatum (D-Antigen) 8 U., virus poliomyelitis typus 3 inactivatum (D-Antigen) 32 U., aluminium ut aluminii hydroxidum hydricum ad adsorptionem, formaldehydum 10 µg, conserv.: phenoxyethanolum 2.5 µl, residui: neomycinum, streptomycinum, polymyxini B sulfas, medium199, aqua q.s. ad suspensionem pro 0.5 ml.'
1034
+ string =
1035
+ 'I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum tetani 40 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg, virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U., virus poliomyelitis typus 2 inactivatum (D-Antigen) 8 U., virus poliomyelitis typus 3 inactivatum (D-Antigen) 32 U., aluminium ut aluminii hydroxidum hydricum ad adsorptionem, formaldehydum 10 µg, conserv.: phenoxyethanolum 2.5 µl, residui: neomycinum, streptomycinum, polymyxini B sulfas, medium199, aqua q.s. ad suspensionem pro 0.5 ml.'
1036
+ composition = ParseComposition.from_string(string)
1037
+ specify { expect(composition.source).to eq string }
1038
+ specify { expect(composition.label).to eq 'I' }
1039
+ end
1040
+
1041
+ context "should return correct composition for 'conserv.: E 217, E 219'" do
1042
+ string = 'conserv.: E 217, E 219'
1043
+ composition = ParseComposition.from_string(string)
1044
+ specify { expect(composition.source).to eq string }
1045
+ specify { expect(composition.label).to eq nil }
1046
+ end
1047
+
1048
+ context "should parse more complicated example" do
1049
+ string =
1050
+ "I) DTPa-IPV-Komponente (Suspension): toxoidum diphtheriae 30 U.I., toxoidum pertussis 25 µg et haemagglutininum filamentosum 25 µg"
1051
+ composition = ParseComposition.from_string(string)
1052
+ specify { expect(composition.source).to eq string }
1053
+
1054
+ specify { expect(composition.label).to eq 'I' }
1055
+ specify { expect(composition.label_description).to eq 'DTPa-IPV-Komponente (Suspension)' }
1056
+
1057
+ specify { expect(composition.galenic_form).to eq nil }
1058
+ specify { expect(composition.route_of_administration).to eq nil }
1059
+
1060
+ toxoidum = composition.substances.find{|x| /toxoidum diphther/i.match(x.name)}
1061
+ specify { expect(toxoidum.name).to eq 'Toxoidum Diphtheriae' }
1062
+ specify { expect(toxoidum.qty).to eq 30 }
1063
+ specify { expect(toxoidum.unit).to eq 'U.I.' }
1064
+
1065
+ haema = composition.substances.find{|x| /Haemagglutininum/i.match(x.name)}
1066
+ specify { expect(haema.name).to eq 'Haemagglutininum Filamentosum' }
1067
+ specify { expect(haema.qty).to eq 25 }
1068
+ specify { expect(haema.unit).to eq 'µg' }
1069
+ end
1070
+
1071
+ context "should return correct composition for 'minoxidilum'" do
1072
+ string = 'minoxidilum 2.5 mg, pyrazinamidum 500 mg'
1073
+ composition = ParseComposition.from_string(string)
1074
+ specify { expect(composition.source).to eq string }
1075
+ specify { expect(composition.label).to eq nil }
1076
+ specify { expect(composition.label_description).to eq nil }
1077
+ specify { expect(composition.galenic_form).to eq nil }
1078
+ specify { expect(composition.route_of_administration).to eq nil }
1079
+ substance = composition.substances.first
1080
+ specify { expect(substance.name).to eq 'Minoxidilum' }
1081
+ specify { expect(substance.qty).to eq 2.5 }
1082
+ specify { expect(substance.unit).to eq 'mg' }
1083
+ end
1084
+
1085
+ context "should return correct composition for 'terra'" do
1086
+ string = 'terra'
1087
+ composition = ParseComposition.from_string(string)
1088
+ specify { expect(composition.source).to eq string }
1089
+ specify { expect(composition.label).to eq nil }
1090
+ specify { expect(composition.label_description).to eq nil }
1091
+ specify { expect(composition.galenic_form).to eq nil }
1092
+ specify { expect(composition.route_of_administration).to eq nil }
1093
+ specify { expect( composition.substances.first.name).to eq "Terra" }
1094
+ end
1095
+
1096
+ context "should return correct composition for 'terra silicea spec..'" do
1097
+ string = 'terra silicea spec. 810 mg, excipiens pro compresso'
1098
+ composition = ParseComposition.from_string(string)
1099
+ specify { expect(composition.source).to eq string}
1100
+ specify { expect(composition.label).to eq nil }
1101
+ specify { expect(composition.label_description).to eq nil }
1102
+ specify { expect(composition.galenic_form).to eq nil }
1103
+ specify { expect(composition.route_of_administration).to eq nil }
1104
+ specify { expect( composition.substances.first.name).to eq "Terra Silicea Spec." }
1105
+ end
1106
+
1107
+ context "should return correct composition for 'minoxidilum'" do
1108
+ string = 'minoxidilum 2.5 mg'
1109
+ composition = ParseComposition.from_string(string)
1110
+ specify { expect(composition.source).to eq string }
1111
+ specify { expect(composition.label).to eq nil }
1112
+ specify { expect(composition.label_description).to eq nil }
1113
+ specify { expect(composition.galenic_form).to eq nil }
1114
+ specify { expect(composition.route_of_administration).to eq nil }
1115
+ substance = composition.substances.first
1116
+ specify { expect(substance.name).to eq 'Minoxidilum' }
1117
+ specify { expect(substance.qty).to eq 2.5 }
1118
+ specify { expect(substance.unit).to eq 'mg' }
1119
+ end
1120
+
1121
+ context "should return correct composition for 'minoxidilum'" do
1122
+ string = 'minoxidilum'
1123
+ composition = ParseComposition.from_string(string)
1124
+ specify { expect(composition.source).to eq string }
1125
+ specify { expect(composition.label).to eq nil }
1126
+ specify { expect(composition.label_description).to eq nil }
1127
+ specify { expect(composition.galenic_form).to eq nil }
1128
+ specify { expect(composition.route_of_administration).to eq nil }
1129
+ substance = composition.substances.first
1130
+ specify { expect(substance.name).to eq 'Minoxidilum' }
1131
+ specify { expect(substance.qty).to eq nil }
1132
+ specify { expect(substance.unit).to eq nil }
1133
+ end
1134
+
1135
+ context "should return correct composition for 'minoxidilum excipiens'" do
1136
+ string = 'minoxidilum 2.5 mg, excipiens pro compresso.'
1137
+ composition = ParseComposition.from_string(string)
1138
+ specify { expect(composition.source).to eq string }
1139
+ specify { expect(composition.label).to eq nil }
1140
+ specify { expect(composition.label_description).to eq nil }
1141
+ specify { expect(composition.galenic_form).to eq nil }
1142
+ specify { expect(composition.route_of_administration).to eq nil }
1143
+
1144
+ substance = composition.substances.first
1145
+ specify { expect(substance.name).to eq 'Minoxidilum' }
1146
+ specify { expect(substance.qty).to eq 2.5 }
1147
+ specify { expect(substance.unit).to eq 'mg' }
1148
+ skip 'what is the correct name for excipiens?'# { expect(composition.substances.last.name).to eq 'Excipiens Pro Compresso' }
1149
+ end
1150
+
1151
+ context 'find correct result compositions for nutriflex' do
1152
+ line_1 = 'I) Glucoselösung: glucosum anhydricum 150 g ut glucosum monohydricum, natrii dihydrogenophosphas dihydricus 2.34 g, zinci acetas dihydricus 6.58 mg, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.'
1153
+ line_2 = 'II) Fettemulsion: sojae oleum 25 g, triglycerida saturata media 25 g, lecithinum ex ovo 3 g, glycerolum, natrii oleas, aqua q.s. ad emulsionem pro 250 ml.'
1154
+ line_3 = 'III) Aminosäurenlösung: isoleucinum 2.34 g, leucinum 3.13 g, lysinum anhydricum 2.26 g ut lysini hydrochloridum, methioninum 1.96 g, aqua ad iniectabilia q.s. ad solutionem pro 400 ml.'
1155
+ line_4 = 'I) et II) et III) corresp.: aminoacida 32 g/l, acetas 32 mmol/l, acidum citricum monohydricum, in emulsione recenter mixta 1250 ml.'
1156
+ line_5 = 'Corresp. 4000 kJ.'
1157
+ text = "#{line_1}\n#{line_2}\n#{line_3}\n#{line_4}\n#{line_5}"
1158
+ compositions = ParseUtil.parse_compositions(text, 'glucosum anhydricum, zinci acetas dihydricus, isoleucinum, leucinum')
1159
+ specify { expect(compositions.first.substances.first.name).to eq 'Glucosum Anhydricum'}
1160
+ specify { expect(compositions.first.substances.first.salts.first.name).to eq 'Glucosum Monohydricum'}
1161
+ specify { expect(compositions.size).to eq 5}
1162
+ specify { expect(compositions.first.substances.first.qty.to_f).to eq 150.0}
1163
+ specify { expect(compositions.first.substances.first.unit).to eq 'g/500 ml'}
1164
+
1165
+ specify { expect(compositions[0].source).to eq line_1}
1166
+ specify { expect(compositions[0].label).to eq 'I'}
1167
+ specify { expect(compositions[0].label_description).to eq 'Glucoselösung'}
1168
+ specify { expect(compositions[1].label).to eq 'II' }
1169
+ specify { expect(compositions[2].label).to eq 'III' }
1170
+ glucosum = compositions.first.substances.first
1171
+ specify { expect(glucosum.name).to eq 'Glucosum Anhydricum' }
1172
+ specify { expect(glucosum.qty.to_f).to eq 150.0}
1173
+ specify { expect(glucosum.unit).to eq 'g/500 ml'}
1174
+ specify { expect(compositions[0].substances.size).to eq ExcipiensIs_a_Substance ? 4 : 3 }
1175
+ specify { expect(compositions[1].substances.size).to eq ExcipiensIs_a_Substance ? 6 : 5 } # should have glycerolum, natrii oleas, aqua
1176
+ specify { expect(compositions[2].substances.size).to eq ExcipiensIs_a_Substance ? 5 : 4 }
1177
+ specify { expect(compositions[1].source).to eq line_2}
1178
+ specify { expect(compositions[2].source).to eq line_3}
1179
+ specify { expect(compositions[3].source).to eq line_4}
1180
+ specify { expect(compositions[3].corresp).to eq line_4.sub(/\.$/, '') }
1181
+ specify { expect(compositions[4].source).to eq line_5}
1182
+ specify { expect(compositions[4].corresp).to eq '4000 kJ'}
1183
+
1184
+ # from II)
1185
+ if compositions and compositions[1] and compositions[1].substances
1186
+ lecithinum = compositions[1].substances.find{ |x| x.name.match(/lecithinum/i) }
1187
+ specify { expect(lecithinum).not_to eq nil}
1188
+ if lecithinum
1189
+ specify { expect(lecithinum.name).to eq 'Lecithinum Ex Ovo' }
1190
+ specify { expect(lecithinum.qty.to_f).to eq 3.0}
1191
+ specify { expect(lecithinum.unit).to eq 'g/250 ml'}
1192
+ end
1193
+
1194
+ # From III
1195
+ leucinum = compositions[2].substances.find{ |x| x.name.eql?('Leucinum') }
1196
+ specify { expect(leucinum).not_to eq nil}
1197
+ if leucinum
1198
+ specify { expect(leucinum.name).to eq 'Leucinum' }
1199
+ specify { expect(leucinum.qty.to_f).to eq 3.13}
1200
+ specify { expect(leucinum.unit).to eq 'g/400 ml'}
1201
+ end
1202
+ leucinum_I = compositions[0].substances.find{ |x| x.name.eql?('Leucinum') }
1203
+ specify { expect(leucinum_I).to eq nil}
1204
+ leucinum_II = compositions[1].substances.find{ |x| x.name.eql?('Leucinum') }
1205
+ specify { expect(leucinum_II).to eq nil}
1206
+ # aqua = compositions[2].substances.find{ |x| /aqua ad/i.match(x.name) }
1207
+ # specify { expect(aqua.name).to eq "Aqua Ad Iniectabilia Q.s. Ad Solutionem Pro"}
1208
+ end
1209
+
1210
+ end
1211
+
1212
+ end
1213
+
1214
+ describe ParseUtil::HandleSwissmedicErrors do
1215
+ context 'should handle fixes' do
1216
+ replacement = '\1, \2'
1217
+ pattern_replacement = { /(sulfuris D6\s[^\s]+\smg)\s([^,]+)/ => replacement }
1218
+ test_string = 'sulfuris D6 2,2 mg hypericum perforatum D2 0,66'
1219
+ expected = 'sulfuris D6 2,2 mg, hypericum perforatum D2 0,66'
1220
+ handler = ParseUtil::HandleSwissmedicErrors.new(pattern_replacement )
1221
+ result = handler.apply_fixes(test_string)
1222
+ specify { expect(result).to eq expected }
1223
+ specify { expect(handler.report.size).to eq 2 }
1224
+ specify { expect(/report/i.match(handler.report[0]).class).to eq MatchData }
1225
+ specify { expect(handler.report[1].index(replacement).class).to eq Fixnum }
1226
+ end
1227
+
1228
+ context 'should be used when calling ParseComposition' do
1229
+ replacement = '\1, \2'
1230
+ test_string = 'sulfuris D6 2,2 mg hypericum perforatum D2 0,66'
1231
+ report = ParseComposition.reset
1232
+ composition = ParseComposition.from_string(test_string).clone
1233
+ report = ParseComposition.report
1234
+ specify { expect(composition.substances.size).to eq 2 }
1235
+ specify { expect(composition.substances.first.name).to eq 'Sulfuris D6' }
1236
+ specify { expect(composition.substances.last.name).to eq 'Hypericum Perforatum D2' }
1237
+ specify { expect(/report/i.match(report[0]).class).to eq MatchData }
1238
+ specify { expect(report[1].index(replacement).class).to eq Fixnum }
1239
+ end
1240
+
1241
+ end
1242
+ end if RunSpecificTests
1243
+
1244
+ describe ParseComposition do
1245
+ context "should parse a complex composition" do
1246
+ start_time = Time.now
1247
+ specify { expect( File.exists?(AllCompositionLines)).to eq true }
1248
+ inhalt = IO.readlines(AllCompositionLines)
1249
+ nr = 0
1250
+ @nrErrors = 0
1251
+ inhalt.each{
1252
+ |line|
1253
+ nr += 1
1254
+ next if line.length < 5
1255
+ puts "#{File.basename(AllCompositionLines)}:#{nr} #{@nrErrors} errors: #{line}" if VERBOSE_MESSAGES
1256
+ begin
1257
+ composition = ParseComposition.from_string line
1258
+ rescue Parslet::ParseFailed
1259
+ @nrErrors += 1
1260
+ puts "#{File.basename(AllCompositionLines)}:#{nr} parse_error #{@nrErrors} in: #{line}"
1261
+ # binding.pry
1262
+ # binding.pry if nr > 300
1263
+ end
1264
+ }
1265
+ at_exit { puts "Testing whether #{nr} composition lines can be parsed. Found #{@nrErrors} errors in #{(Time.now - start_time).to_i} seconds" }
1266
+
1267
+ end if RunAllCompositionsTests
1268
+ end