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,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