oddb2xml 2.0.6 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/spec/parslet_spec.rb CHANGED
@@ -15,87 +15,156 @@ puts "hostname is #{hostname} RunAllCompositionsTests #{RunAllCompositionsTests}
15
15
  # Testing whether 8937 composition lines can be parsed. Found 380 errors in 293 seconds
16
16
  # 520 examples, 20 failures, 1 pending
17
17
 
18
- RunCompositionExamples = true
19
- RunSubstanceExamples = true
20
- RunFailingSpec = false
21
- RunExcipiensTest = true
22
- RunSpecificTests = true
23
- RunMostImportantParserTests = true
18
+ RunFailingSpec = true
19
+ VERBOSE_MESSAGES = true
24
20
 
25
21
  describe ParseComposition do
26
22
  to_add = %(
27
23
  VERBOSE_MESSAGES = true
28
24
  pp composition; binding.pry
29
25
  )
26
+
27
+ context "should handle failed" do
28
+ strings = [
29
+ ]
30
+ strings.each{ |string|
31
+ composition = ParseComposition.from_string(string)
32
+ binding.pry if composition.substances.size == 0
33
+ specify { expect( composition.substances.size).not_to eq 0 }
34
+ }
35
+ end
36
+
30
37
  end
31
38
 
39
+ if RunFailingSpec
32
40
  describe ParseComposition do
33
41
 
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"
42
+ end
43
+
44
+ end
45
+
46
+ describe ParseComposition do
47
+ context "should handle 'LA 2x%" do
48
+ # 48473 1 Wala Echinacea-Mundspray, anthroposophisches Arzneimittel
49
+ string = "echinacea pallida ex herba LA 20% TM 10 g"
50
+ composition = ParseComposition.from_string(string)
51
+ specify { expect( composition.substances.size).to eq 1 }
52
+ specify { expect( composition.substances.first.name).to eq "Echinacea Pallida Ex Herba La 20% Tm" }
53
+ end
54
+
55
+ context "should handle 'CRM 197" do
56
+ # 1 Prevenar 13, Suspension in Fertigspritzen
57
+ string = "proteinum corynebacteriae diphtheriae CRM 197 ca. 32 µg"
58
+ composition = ParseComposition.from_string(string)
59
+ specify { expect( composition.substances.size).to eq 1 }
60
+ specify { expect( composition.substances.first.name).to eq "Proteinum Corynebacteriae Diphtheriae Crm 197" }
61
+ end
62
+
63
+ context "should handle ', Corresp. '" do
64
+ # 65427 1 Adlers Bronchialpastillen, Pastillen
65
+ string = "liquiritiae extractum ethanolicum liquidum corresp. acidum glycyrrhizinicum 2.0-2.6 mg, DER: 1.8-2.1:1, Corresp. massa siccata 19.67 mg, droserae extractum ethanolicum liquidum, ratio: 0.6:1, Corresp. massa siccata 0.42 mg, plantaginis folii extractum ethanolicum liquidum, ratio: 0.51:1, Corresp. massa siccata 1.9 mg, aromatica, natrii cyclamas, excipiens pro pastillo"
66
+ composition = ParseComposition.from_string(string)
67
+ specify { expect( composition.substances.size).to eq 6 }
68
+ specify { expect( composition.substances.first.name).to eq "Liquiritiae Extractum Ethanolicum Liquidum" }
69
+ end
70
+
71
+ context "should handle ',,'" do
72
+ # 52433 1 Botox 100 Allergan-Einheiten, Pulver zur Herstellung einer Injektionslösung
73
+ string = "Praeparatio cryodesiccata: toxinum botulinicum A 100 U. Botox,, albuminum humanum, natrii chloridum, pro vitro."
36
74
  composition = ParseComposition.from_string(string)
37
- specify { expect(composition.source).to eq string}
38
75
  specify { expect( composition.substances.size).to eq 3 }
39
- specify { expect( composition.substances.first.name).to eq "Nicotinum" } # TODO: is not Benzocainum
76
+ specify { expect( composition.substances.first.name).to eq 'Toxinum Botulinicum A' }
77
+ specify { expect( composition.excipiens.name).to match /vitro/i }
78
+ end
79
+
80
+ context "should handle corresp. excipiens" do
81
+ string = "petasina 8 mg corresp. excipiens pro compresso obducto"
82
+ composition = ParseComposition.from_string(string)
83
+ specify { expect( composition.substances.size).to eq 1 }
84
+ specify { expect( composition.substances.first.name).to eq 'Petasina' }
85
+ specify { expect( composition.excipiens.name).to match /excipiens/i }
40
86
  end
41
87
 
42
88
  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'
89
+ # 62573 2 Staloral 300 3 Bäume (300 IR/ml) , sublinguale Lösung
90
+ string = 'III): pro usu: I) et II) recenter radioactivatum 99m-technetio ut natrii pertechnetas'
44
91
  composition = ParseComposition.from_string(string)
45
92
  specify { expect(composition.source).to eq string}
46
93
  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.' }
94
+ specify { expect( composition.label).to eq nil }
95
+ specify { expect( composition.corresp).to eq 'III): pro usu: I) et II) recenter radioactivatum 99m-technetio ut natrii pertechnetas' }
49
96
  end
50
97
 
51
- context "should handle dose with /" do
52
- string = 'poly(dl-lactidum-co-glycolidum) 75/25'
98
+ context "should handle Tela cum praeparatione" do
99
+ string ='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'
53
100
  composition = ParseComposition.from_string(string)
54
101
  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' }
102
+ specify { expect( composition.substances.first.name).to eq "Niccoli Sulfas" }
103
+ specify { expect( composition.label).to eq "Tela cum praeparatione (Panel 1):" }
57
104
  end
58
105
 
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'
106
+ context "should handle '&' and 'deklr.'" do
107
+ string = 'TM: cardiospermum halicacabum 100 mg, cetearyl octanoat & isopropylmyristat deklar., alcohol benzylicus, aqua q.s. ad unguentum pro'
108
+ composition = ParseComposition.from_string(string)
109
+ specify { expect( composition.substances.first.name).to eq "Tm: Cardiospermum Halicacabum" }
110
+ end
111
+
112
+ context "should handle '150 U.I. hFSH et 150 U.I. hLH'" do
113
+ string = 'Praeparatio cryodesiccata: menotropinum 150 U.I. hFSH et 150 U.I. hLH, gonadotropinum chorionicum 7-21 U.I. hCG, lactosum monohydricum, pro vitro'
61
114
  composition = ParseComposition.from_string(string)
62
115
  specify { expect(composition.source).to eq string}
63
- specify { expect( composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum)" }
116
+ specify { expect( composition.substances.first.name).to eq "Menotropinum" }
117
+ specify { expect( composition.substances.first.dose.to_s).to eq "150 U.I. hFSH et 150 U.I. hLH" }
64
118
  end
65
119
 
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'
120
+ context "should handle missing arom.: before excipiens" do
121
+ string = "nicotinum 4 mg ut nicotini resinas, aromatica, antiox.: E 321, arom.: excipiens pro praeparatione"
68
122
  composition = ParseComposition.from_string(string)
69
123
  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:" }
124
+ specify { expect(composition.substances.size).to eq 3 }
125
+ specify { expect( composition.substances.first.name).to eq "Nicotinum" }
72
126
  end
73
127
 
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'
128
+ context "should handle missing Label A:) in pollinis allergeni extractu" do
129
+ # 62573 2 Staloral 300 3 Bäume (300 IR/ml) , sublinguale Lösung
130
+ string = 'pollinis allergeni extractum (alnus glutinosa, betula alba, corylus avellana) 300 U.: excipiens ad solutionem pro 1 ml'
76
131
  composition = ParseComposition.from_string(string)
77
132
  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' }
133
+ specify { expect( composition.substances.size).to eq 1 }
134
+ specify { expect( composition.substances.first.name).to eq "Pollinis Allergeni Extractum (alnus Glutinosa, Betula Alba, Corylus Avellana)" }
135
+ specify { expect( composition.label).to eq nil }
80
136
  end
81
137
 
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'
138
+ context "handle 39541 A. Vogel Entspannungs-Tropfen" do
139
+ string = "passiflorae herbae recentis tinctura, ratio: 1:12, corresp. ethanolum 65 % V/V"
140
+ composition = ParseComposition.from_string(string)
141
+ specify { expect(composition.substances.size).to eq 1 }
142
+ specify { expect(composition.substances.first.name).to eq "Passiflorae Herbae Recentis Tinctura" }
143
+ specify { expect(composition.substances.first.more_info).to eq "ratio: 1:12" }
144
+ end
145
+
146
+ context "handle II) Aprotininlösung:" do
147
+ string = "II) Aprotininlösung: aprotininum 1000 U.K.I., natrii chloridum, aqua q.s. ad solutionem, pro vitro 1 ml"
148
+ composition = ParseComposition.from_string(string)
149
+ specify { expect(composition.substances.size).to eq 2 }
150
+ specify { expect(composition.substances.first.name).to eq "Aprotininum" }
151
+ end
152
+
153
+ context "handle ut aqua ad" do
154
+ string = 'natrii oleas ut aqua ad iniectabilia q.s. ad emulsionem pro 250 ml'
84
155
  composition = ParseComposition.from_string(string)
85
156
  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):" }
157
+ specify { expect( composition.substances.size).to eq 1 }
158
+ specify { expect( composition.substances.first.name).to eq 'Natrii Oleas' }
88
159
  end
89
160
 
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'
161
+ context 'find unit for aqua q.s. ad emulsionem pro 250 ml' do
162
+ string = "q.s. ad emulsionem pro 250 ml."
93
163
  composition = ParseComposition.from_string(string)
94
164
  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):" }
165
+ specify { expect(composition.substances.size).to eq 0}
166
+ specify { expect( composition.excipiens.dose.to_s).to eq "250 ml" }
167
+ specify { expect( composition.excipiens.name).to match /emulsionem/i }
99
168
  end
100
169
 
101
170
  context "should handle '150 U.I. hFSH et 150 U.I. hLH'" do
@@ -106,11 +175,11 @@ describe ParseComposition do
106
175
  specify { expect( composition.substances.first.dose.to_s).to eq "150 U.I. hFSH et 150 U.I. hLH" }
107
176
  end
108
177
 
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'
178
+ context "should handle per centum" do
179
+ 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'
111
180
  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" }
181
+ specify { expect(composition.source).to eq string}
182
+ specify { expect( composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum" }
114
183
  end
115
184
 
116
185
  context "should handle 'potenziert mit: excipiens pro compresso'" do
@@ -121,76 +190,170 @@ describe ParseComposition do
121
190
  specify { expect(composition.label_description).to eq nil }
122
191
  specify { expect(composition.galenic_form).to eq nil }
123
192
  specify { expect(composition.route_of_administration).to eq nil }
124
- specify { expect( composition.substances.first.name).to eq "Terra Silicea Spec." }
193
+ specify { expect( composition.substances.first.name).to eq "Ambra Grisea D6" }
194
+ end
195
+
196
+ context "allow ut followed by et" do
197
+ # 49417 1 Burgerstein EPA-Kapseln 500mg, Kapseln
198
+ string =
199
+ "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."
200
+ composition = ParseComposition.from_string(string)
201
+ specify { expect(composition.substances.first.name).to eq 'Piscis Oleum' } # TODO:
202
+ specify { expect(composition.substances.first.chemical_substance.name).to eq 'Acida Carboxylica Omega-3 Oligoinsaturata' } # TODO:
203
+ specify { expect(composition.substances.size).to eq 2 }
204
+ specify { expect(composition.substances.first.salts.size).to eq 0 }
205
+ specify { expect(composition.substances.first.chemical_substance.salts.size).to eq 1 }
206
+ specify { expect(composition.substances.first.chemical_substance.salts.first.name).to eq "Acidum Eicosapentaenoicum" }
207
+ end
208
+
209
+ context 'find correct result Solvens (i.m.)' do
210
+ string = "Solvens (i.m.): aqua ad iniectabilia 2 ml pro vitro"
211
+ composition = ParseComposition.from_string(string)
212
+ specify { expect(composition.substances.size).to eq 0 }
213
+ specify { expect(composition.corresp).to eq 'aqua ad iniectabilia 2 ml pro vitro' }
125
214
  end
126
215
 
127
216
  context "allow substancename with 'ethanol.'" do
128
217
  string = "mandragora ethanol. decoctum D1 30 mg"
129
218
  composition = ParseComposition.from_string(string)
130
- specify { expect(composition.substances.size).to eq 1 }
219
+ specify { expect(composition.substances.size).to eq 1 }
131
220
  specify { expect(composition.substances.first.name).to eq "Mandragora Ethanol. Decoctum D1" }
132
221
  specify { expect(composition.substances.first.dose.to_s).to eq "30 mg" }
133
222
  end
134
223
 
135
224
  context "allow substance complicated, calculated dose '6.0 +/-1.2 µg'" do
136
225
  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"
226
+ "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"
138
227
  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 }
228
+ specify { expect(composition.substances.first.name).to eq 'Enzephalitidis Japanensis Virus Antigenum (stamm: Sa-14-2)' }
229
+ specify { expect(composition.substances.first.chemical_substance).to eq nil }
230
+ specify { expect(composition.substances.first.dose.to_s).to eq '6.0 +/-1.2 µg/0.5 ml' }
231
+ specify { expect(composition.substances.size).to eq 5 }
142
232
  end
143
233
 
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"
234
+ context "should handle 'aqua ad iniectabilia ad solutionem'" do
235
+ string = "aqua ad iniectabilia ad solutionem"
236
+ composition = ParseComposition.from_string(string)
237
+ specify { expect(composition.substances.size).to eq 0 }
238
+ specify { expect(composition.corresp).to match /ad iniectabilia/ }
239
+ end
240
+
241
+ context "should handle Corresp. ca. 8370 kJ" do
242
+ string = "Corresp. ca. 8370 kJ"
243
+ composition = ParseComposition.from_string(string)
244
+ specify { expect(composition.substances.size).to eq 0 }
245
+ specify { expect(composition.corresp).to match /8370 kJ/i }
246
+ end
247
+
248
+ context "should handle Praeparatio sicca and polysorbatum" do
249
+ 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'
250
+ composition = ParseComposition.from_string(string)
251
+ specify { expect(composition.source).to eq string}
252
+ specify { expect( composition.substances.first.name).to eq "Albiglutidum" }
253
+ specify { expect( composition.label).to eq "Praeparatio sicca cum solvens: praeparatio sicca:" }
254
+ end
255
+
256
+ context "handle placebo compressa: excipiens pro compresso obducto" do
257
+ string = "II) placebo compressa: excipiens pro compresso obducto"
258
+ composition = ParseComposition.from_string(string)
259
+ specify { expect(composition.substances.size).to eq 0 }
260
+ specify { expect(composition.label).to eq "II" }
261
+ specify { expect(composition.label_description).to eq "placebo compressa" }
262
+ end
263
+
264
+ context "handle 46489 Polvac Gräser+Roggen" do
265
+ string = "A): pollinis allergeni extractum 300 U. (secali cereale cum 12 gramina: Arrhenatherum elatius, Cynosurus cristatus, Dactylis glomerata, Lolium spp., Poa pratensis, Anthoxanthum odoratum, Festuca pratensis, Agrostis tenuis, Bromus ssp., Alopecurus pratensis, Phleum pratense, Holcus lanatus), tyrosinum, natrii chloridum, glycerolum, conserv.: phenolum 2.5 mg, aqua ad iniectabilia q.s. ad solutionem pro 0.5 ml."
147
266
  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
267
  specify { expect(composition.substances.size).to eq 5 }
268
+ tyrosinum = composition.substances.find{ |x| /Tyrosinum/i.match(x.name) }
269
+ specify { expect(composition.substances.first.name).to eq "Pollinis Allergeni Extractum 300 U. (secali Cereale Cum 12 Gramina: Arrhenatherum Elatius, Cynosurus Cristatus, Dactylis Glomerata, Lolium Spp., Poa Pratensis, Anthoxanthum Odoratum, Festuca Pratensis, Agrostis Tenuis, Bromus Ssp., Alopecurus Pratensis, Phleum Pratense, Holcus Lanatus)" }
270
+ specify { expect(tyrosinum.name).to eq "Tyrosinum" }
271
+ specify { expect(composition.label).to eq "A" }
151
272
  end
152
- end if RunFailingSpec
273
+
274
+ context "handle ratio" do
275
+ string =
276
+ "digestio aquosa 500 mg ex dryopteris filix-mas ex herba recenti 40 mg, pteridium aquilinum ex herba recenti 40 mg, polypodium vulgare ex herba recenti 10 mg, Phyllitis scolopendrium ex herba recenti 10 mg, ratio: 1:4,1, extractum ethanolicum 400 mg ex salicis albae folium recens 20 mg, salicis purpureae folium recens 20 mg, salicis viminalis folium recens 40 mg, salicis vitellinae folium recens 20 mg, ratio: 1:3,1, excipiens ad solutionem pro 1 g, corresp. 10 guttae, corresp. ethanolum 25 % V/V"
277
+ composition = ParseComposition.from_string(string)
278
+ substance = composition.substances.find{ |x| /Scolopendrium/i.match(x.name) }
279
+ specify { expect(substance.name).to eq "Phyllitis Scolopendrium Ex Herba Recenti" }
280
+ specify { expect(substance.more_info).to eq "ratio: 1:4,1" }
281
+ end
282
+
283
+ context "should skip lines containing I) et II)" do
284
+ 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'
285
+ composition = ParseComposition.from_string(string)
286
+ specify { expect(composition.source).to eq string }
287
+ specify { expect(composition.substances.size).to eq 0 }
288
+ specify { expect(composition.corresp).to eq string }
289
+ end
290
+
291
+ context "should handle dose with /" do
292
+ string = 'poly(dl-lactidum-co-glycolidum) 75/25'
293
+ composition = ParseComposition.from_string(string)
294
+ specify { expect(composition.source).to eq string}
295
+ specify { expect( composition.substances.first.name).to eq "Poly(dl-lactidum-co-glycolidum)" }
296
+ specify { expect( composition.substances.first.dose.to_s).to eq '75/25' }
297
+ end
298
+
299
+ context "should handle dose with +/-" do
300
+ 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'
301
+ composition = ParseComposition.from_string(string)
302
+ specify { expect(composition.source).to eq string}
303
+ specify { expect( composition.substances.first.name).to eq "Enzephalitidis Japanensis Virus Antigenum (stamm: Sa-14-2)" }
304
+ specify { expect( composition.substances.first.dose.to_s).to eq '6.0 +/-1.2 µg/0.5 ml' }
305
+ end
306
+
307
+ context "should handle label Praeparatio cryodesiccata (Thrombin)" do
308
+ string = 'Praeparatio cryodesiccata (Thrombin): thrombinum humanum 500 U.I., natrii chloridum, natrii citras dihydricus, pro vitro'
309
+ composition = ParseComposition.from_string(string)
310
+ specify { expect(composition.source).to eq string}
311
+ specify { expect( composition.substances.first.name).to eq "Thrombinum Humanum" }
312
+ specify { expect( composition.label).to eq "Praeparatio cryodesiccata (Thrombin):" }
313
+ end
314
+
315
+ end
153
316
 
154
317
  describe ParseComposition do
155
318
  context "allow 2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)" do
156
319
  string = "2,2'-methylen-bis(6-tert.-butyl-4-methyl-phenolum)"
157
320
  composition = ParseComposition.from_string(string)
158
321
  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 }
322
+ specify { expect(composition.substances.size).to eq 1 }
160
323
  end
161
324
 
162
325
  context "allow substancename with 90 % " do
163
326
  string =
164
327
  "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
328
  composition = ParseComposition.from_string(string)
166
- specify { expect(composition.substances.size).to eq 5 }
329
+ specify { expect(composition.substances.size).to eq 5 }
167
330
  substance = composition.substances.find{ |x| /lacticum/i.match(x.name) }
168
331
  specify { expect(composition.substances.first.name).to eq "Acidum Nitricum 70 Per Centum" }
169
332
  specify { expect(composition.substances.first.dose.to_s).to eq "580.66 mg/ml" }
170
333
  specify { expect(substance.name).to eq 'Acidum Lacticum 90 %' }
171
334
  specify { expect(substance.dose.to_s).to eq '4.55 mg/ml' }
172
335
  end
336
+
173
337
  context "allow substance with two corresp" do
174
338
  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
339
  composition = ParseComposition.from_string(string)
176
340
  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' }
341
+ skip { expect(composition.substances.first.name).to eq 'Magnesii Aspartas Dihydricus' }
342
+ skip { expect(composition.substances.first.chemical_substance.name).to eq 'Magnesium' }
179
343
  end
180
- specify { expect(composition.substances.size).to eq 5 }
344
+ specify { expect(composition.substances.size).to eq 6 }
181
345
  end
182
346
 
183
347
  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"
348
+ string = "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
349
  composition = ParseComposition.from_string(string)
187
- specify { expect(composition.substances.size).to eq 5 }
350
+ specify { expect(composition.substances.size).to eq 4 }
188
351
  end
189
352
 
190
353
  context "allow substances containing 'A + '" do
191
354
  string = "sennosida 20 mg corresp. sennosida A + B calcica 12 mg, excipiens pro compresso obducto"
192
355
  composition = ParseComposition.from_string(string)
193
- specify { expect(composition.substances.size).to eq 1 }
356
+ specify { expect(composition.substances.size).to eq 1 }
194
357
  specify { expect(composition.substances.first.name).to eq 'Sennosida' }
195
358
  specify { expect(composition.substances.first.chemical_substance.name).to eq 'Sennosida A + B Calcica' }
196
359
  end
@@ -198,13 +361,15 @@ describe ParseComposition do
198
361
  context "allow substances separted by ', et'" do
199
362
  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
363
  composition = ParseComposition.from_string(string)
201
- specify { expect(composition.substances.size).to eq 2 }
364
+ specify { expect(composition.substances.size).to eq 2 }
365
+ specify { expect(composition.substances.first.name).to eq 'Echinaceae Purpureae Herbae Recentis Tinctura' }
366
+ specify { expect(composition.substances.last.name).to eq 'Echinaceae Purpureae Radicis Recentis Tinctura' }
202
367
  end
203
368
 
204
369
  context 'find kalium 40 mmol/l' do
205
370
  string = "kalium 40 mmol/l, chloridum 194 mmol/l, natrium 154 mmol/l, aqua ad iniectabilia q.s. ad solutionem pro 1000 ml"
206
371
  composition = ParseComposition.from_string(string)
207
- specify { expect(composition.substances.size).to eq 3 }
372
+ specify { expect(composition.substances.size).to eq 3 }
208
373
  specify { expect(composition.substances.first.name).to eq 'Kalium' }
209
374
  specify { expect(composition.substances.first.dose.to_s).to eq "40 mmol/l/1000 ml" }
210
375
  end
@@ -212,7 +377,7 @@ describe ParseComposition do
212
377
  context 'find corresp doses pro vase.' do
213
378
  string = "farfarae folii recentis succus ratio: 1:0.68-0.95"
214
379
  composition = ParseComposition.from_string(string)
215
- specify { expect(composition.substances.size).to eq 1 }
380
+ specify { expect(composition.substances.size).to eq 1 }
216
381
  specify { expect(composition.substances.last.name).to eq 'Farfarae Folii Recentis Succus' }
217
382
  specify { expect(composition.substances.last.more_info).to eq "ratio: 1:0.68-0.95" }
218
383
  end
@@ -220,15 +385,15 @@ describe ParseComposition do
220
385
  context 'find corresp doses pro vase.' do
221
386
  string = "doses pro vase 30/60"
222
387
  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' }
388
+ specify { expect(composition.substances.size).to eq 0 }
389
+ specify { expect(composition.corresp).to match /pro vase/i }
226
390
  end
227
391
 
392
+
228
393
  context 'find corresp. ca.' do
229
394
  string = "sal ems 100 % m/m, corresp. ca., natrium 308.7 mg/g"
230
395
  composition = ParseComposition.from_string(string)
231
- specify { expect(composition.substances.size).to eq 1 }
396
+ specify { expect(composition.substances.size).to eq 1 }
232
397
  specify { expect(composition.substances.last.name).to eq 'Sal Ems' }
233
398
  end
234
399
 
@@ -241,7 +406,7 @@ describe ParseComposition do
241
406
  context 'find correct result for dose 1 Mio U.I.' do
242
407
  string = "phenoxymethylpenicillinum kalicum 1 Mio U.I., conserv.: E 200, excipiens pro compresso obducto"
243
408
  composition = ParseComposition.from_string(string)
244
- specify { expect(composition.substances.size).to eq 2 }
409
+ specify { expect(composition.substances.size).to eq 2 }
245
410
  specify { expect(composition.substances.first.name).to eq 'Phenoxymethylpenicillinum Kalicum' }
246
411
  specify { expect(composition.substances.first.dose.to_s).to eq '1 Mio U.I.' }
247
412
  specify { expect(composition.substances.last.name).to eq 'E 200' }
@@ -285,10 +450,9 @@ describe ParseComposition do
285
450
  end
286
451
 
287
452
  context 'find correct result Überzug: E 132' do
288
- # 16863 1 Salvia Wild, Tropfen
289
453
  string = "olanzapinum 15 mg, Überzug: E 132, excipiens pro compresso obducto."
290
454
  composition = ParseComposition.from_string(string)
291
- specify { expect(composition.substances.size).to eq 2 }
455
+ specify { expect(composition.substances.size).to eq 2 }
292
456
  specify { expect(composition.substances.first.name).to eq 'Olanzapinum' }
293
457
  specify { expect(composition.substances.last.name).to eq 'E 132' }
294
458
  specify { expect(composition.substances.last.more_info).to eq 'Überzug' }
@@ -300,17 +464,17 @@ describe ParseComposition do
300
464
  composition = ParseComposition.from_string(string)
301
465
  specify { expect(composition.label).to eq nil }
302
466
  specify { expect(composition.label_description).to eq nil }
303
- specify { expect(composition.substances.size).to eq 1 }
467
+ specify { expect(composition.substances.size).to eq 1 }
304
468
  specify { expect(composition.substances.first.name).to eq 'Dasabuvirum' }
305
469
  specify { expect(composition.substances.first.salts.size).to eq 1 }
306
- specify { expect(composition.substances.first.salts.first.name).to eq 'Dasabuvirum Natricum Monohydricum' }
470
+ specify { expect(composition.substances.first.salts.first.name).to eq 'Dasabuvirum Natricum' }
471
+ specify { expect(composition.substances.first.salts.first.chemical_substance.name).to eq 'Dasabuvirum Natricum Monohydricum' }
307
472
  end
308
473
 
309
474
  context 'find correct result for ut excipiens' do
310
- # 16863 1 Salvia Wild, Tropfen
311
475
  string = "drospirenonum 3 mg, ethinylestradiolum 20 µg ut excipiens pro compresso obducto"
312
476
  composition = ParseComposition.from_string(string)
313
- specify { expect(composition.substances.size).to eq 2 }
477
+ specify { expect(composition.substances.size).to eq 2 }
314
478
  specify { expect(composition.substances.last.name).to eq 'Ethinylestradiolum' }
315
479
  end
316
480
 
@@ -318,10 +482,11 @@ describe ParseComposition do
318
482
  # 16863 1 Salvia Wild, Tropfen
319
483
  string = "salviae extractum ethanolicum liquidum, DER: 1:4.2-5.0 corresp. ethanolum 40 % V/V"
320
484
  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' }
485
+ specify { expect(composition.substances.size).to eq 2 }
486
+ specify { expect(composition.substances[1].name).to eq 'DER: 1:4.2-5.0' }
323
487
  end
324
488
 
489
+
325
490
  context 'find correct result compositions for 00613 Pentavac' do
326
491
  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
492
  line_2 = "II) Hib-Komponente (Lyophilisat): haemophilus influenzae Typ B polysaccharida T-conjugatum 10 µg, trometamolum, saccharum, pro praeparatione."
@@ -345,7 +510,7 @@ describe ParseComposition do
345
510
  context 'find correct result compositions for fluticasoni with chemical_dose' do
346
511
  string = 'fluticasoni-17 propionas 100 µg, lactosum monohydricum q.s. ad pulverem pro 25 mg.'
347
512
  composition = ParseComposition.from_string(string)
348
- specify { expect(composition.substances.size).to eq 2 }
513
+ specify { expect(composition.substances.size).to eq 2 }
349
514
  fluticasoni = composition.substances.find{ |x| x.name.match(/Fluticasoni/i) }
350
515
  specify { expect(fluticasoni.name).to eq 'Fluticasoni-17 Propionas' }
351
516
  specify { expect(fluticasoni.qty.to_f).to eq 100.0 }
@@ -353,13 +518,14 @@ describe ParseComposition do
353
518
  specify { expect(fluticasoni.dose.to_s).to eq "100 µg/25 mg" }
354
519
  lactosum = composition.substances.find{ |x| x.name.match(/Lactosum/i) }
355
520
  specify { expect(lactosum.name).to eq "Lactosum Monohydricum" }
356
- specify { expect(lactosum.dose.to_s).to eq "25 mg" }
521
+ skip { expect(lactosum.dose.to_s).to eq "25 mg" }
357
522
  end
358
523
 
359
524
  context 'find correct result Solvens (i.m.)' do
360
525
  string = "Solvens (i.m.): aqua ad iniectabilia 2 ml pro vitro"
361
526
  composition = ParseComposition.from_string(string)
362
- specify { expect(composition.substances.first.name).to eq 'aqua ad iniectabilia 2 Ml pro Vitro' }
527
+ specify { expect(composition.substances.size).to eq 0}
528
+ specify { expect(composition.corresp).to eq 'aqua ad iniectabilia 2 ml pro vitro' }
363
529
  end
364
530
 
365
531
  context "should handle Iscador" do
@@ -380,10 +546,10 @@ describe ParseComposition do
380
546
  # 47657 1 Nanocoll, Markierungsbesteck
381
547
  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
548
  composition = ParseComposition.from_string(string)
383
- specify { expect(composition.substances.size).to eq 6 }
549
+ specify { expect(composition.substances.size).to eq 6 }
384
550
  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 "" }
551
+ specify { expect(poloxamerum.name).to eq 'Poloxamerum 238' }
552
+ specify { expect(poloxamerum.qty.to_f).to eq 0.0 }
387
553
  specify { expect(poloxamerum.unit).to eq nil }
388
554
  end
389
555
 
@@ -439,16 +605,6 @@ describe ParseComposition do
439
605
  specify { expect(composition.substances.size).to eq 1 }
440
606
  end
441
607
 
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
608
  context "should treat correctly CFU units" do
453
609
  # 56015 Perskindol Cool avec consoude, gel
454
610
  string = 'lactobacillus acidophilus cryodesiccatus min. 10^9 CFU'
@@ -516,20 +672,20 @@ describe ParseComposition do
516
672
  specify { expect(composition.substances.size).to eq 1 }
517
673
  specify { expect(composition.substances.first.more_info).to eq "mineralia" }
518
674
  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' }
675
+ substance = composition.substances.first.salts.find{ |x| /Magnesium/i.match(x.name) }
676
+ specify { expect(substance.name).to eq 'Magnesium' }
677
+ specify { expect(substance.qty).to eq 120.0 }
678
+ specify { expect(substance.unit).to eq 'mg' }
522
679
  specify { expect(composition.substances.first.name).to eq 'Calcium' } # TODO:
523
680
  # TODO: specify { expect(composition.substances.first.dose.to_s).to eq '9 g/L 5 ml' }
524
681
  end
525
682
 
526
- context "should handle solvens" do
683
+ context "should handle Solvens line" do
527
684
  string = 'Solvens: natrii chloridi solutio 9 g/L 5 ml.'
528
685
  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' }
686
+ specify { expect(composition.substances.size).to eq 0 }
687
+ specify { expect(composition.corresp).to eq 'natrii chloridi solutio 9 g/L 5 ml' }
688
+ skip { expect(composition.excipiens.substance.name).to eq 'Natrii Chloridi Solutio' }
533
689
  end
534
690
 
535
691
  context "should parse a complex composition" do
@@ -545,7 +701,7 @@ describe ParseComposition do
545
701
  string = "acari allergeni extractum (acarus siro) 50'000 U., conserv.: phenolum, excipiens ad solutionem pro 1 ml."
546
702
  composition = ParseComposition.from_string(string)
547
703
  specify { expect(composition.source).to eq string }
548
- specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 3 : 2 } # got only 1
704
+ specify { expect(composition.substances.size).to eq 2 } # got only 1
549
705
  specify { expect(composition.substances.first.more_info).to eq nil }
550
706
  specify { expect(composition.substances.first.name).to eq 'Acari Allergeni Extractum (acarus Siro)' }
551
707
  specify { expect(composition.substances.last.name).to eq 'Phenolum' } # was Acari Allergeni Extractum (acarus Siro)
@@ -561,11 +717,11 @@ describe ParseComposition do
561
717
  specify { expect(composition.label).to eq "A" }
562
718
  specify { expect(composition.label_description).to eq "acari allergeni extractum 50 U." }
563
719
  specify { expect(composition.source).to eq string }
564
- specify { expect(composition.substances.size).to eq 5 }
720
+ specify { expect(composition.substances.size).to eq 5 }
565
721
  pteronyssinus = composition.substances.find{ |x| /pteronyssinus/i.match(x.name) }
566
722
  specify { expect(composition.substances.first.name).to eq 'Dermatophagoides Farinae' }
567
723
  specify { expect(pteronyssinus.name).to eq 'Dermatophagoides Pteronyssinus' }
568
- specify { expect(pteronyssinus.more_info).to eq nil }
724
+ specify { expect(pteronyssinus.more_info).to eq nil}
569
725
  end
570
726
 
571
727
  context "should return correct composition for containing 'virus rabiei inactivatum" do
@@ -584,110 +740,67 @@ describe ParseComposition do
584
740
  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
741
  composition = ParseComposition.from_string(string)
586
742
  specify { expect(composition.source).to eq string }
587
- specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 5 : 4 }
743
+ specify { expect(composition.substances.size).to eq 4 }
588
744
  specify { expect(composition.substances.first.name).to eq 'Pollinis Allergeni Extractum (phleum Pratense)' }
589
745
  end
590
746
 
591
- if RunExcipiensTest
592
747
  context "should handle aqua ad iniectabilia" do
593
- string = "aqua ad iniectabilia q.s. ad solutionem pro 5 ml"
748
+ string = "any_substance, aqua ad iniectabilia q.s. ad solutionem pro 5 ml"
594
749
  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
750
+ substance = composition.substances.last
751
+ specify { expect(composition.excipiens.name).to eq 'aqua ad iniectabilia q.s. ad solutionem' }
752
+ specify { expect(composition.excipiens.chemical_substance).to eq nil }
753
+ specify { expect(composition.excipiens.qty).to eq 5.0}
754
+ specify { expect(composition.excipiens.unit).to eq 'ml' }
604
755
  end
605
756
 
606
757
  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"
758
+ string = "any_substance, excipiens ad solutionem pro 1 ml corresp. ethanolum 59.5 % V/V"
608
759
  composition = ParseComposition.from_string(string)
609
760
  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
761
+ # TODO: what should we report here? dose = pro 1 ml or 59.5 % V/V, chemical_substance = ethanolum?
762
+ # or does it only make sense as part of a composition?
763
+ skip { expect(composition.excipiens.name).to eq 'Ethanolum' }
764
+ specify { expect(composition.excipiens.cdose).to eq nil }
765
+ skip { expect(composition.excipiens.qty).to eq 59.5}
766
+ skip { expect(composition.excipiens.unit).to eq '% V/V' }
620
767
  end
621
768
 
622
769
  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"
770
+ string = 'something, excipiens ad emulsionem pro 1 g"'
636
771
  composition = ParseComposition.from_string(string)
637
772
  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
773
+ specify { expect(composition.source).to eq string }
774
+ specify { expect(composition.substances.size).to eq 1 }
647
775
  end
648
776
 
649
777
  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"
778
+ string = "natrii dihydrogenophosphas dihydricus, aqua q.s. ad suspensionem pro 0.5 ml."
651
779
  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
780
+ specify { expect(composition.excipiens.name).to match /aqua|excipiens/ }
781
+ specify { expect(composition.excipiens.qty).to eq 0.5}
782
+ specify { expect(composition.excipiens.unit).to eq 'ml' }
660
783
  end
661
784
 
662
785
  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"
786
+ string = "any_substance, excipiens ad solutionem pro 3 ml corresp. 50 µg"
664
787
  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
788
+ specify { expect(composition.excipiens.name).to match /Excipiens/i }
789
+ specify { expect(composition.excipiens.qty).to eq 3.0}
790
+ specify { expect(composition.excipiens.unit).to eq 'ml' }
791
+ specify { expect(composition.excipiens.cdose.qty).to eq 50.0}
792
+ specify { expect(composition.excipiens.cdose.unit).to eq 'µg' }
675
793
  end
676
794
 
677
795
  context "should return correct substance for 'excipiens ad pulverem pro 1000 mg'" do
678
- string = "excipiens ad pulverem pro 1000 mg"
796
+ string = "any_substance, excipiens ad pulverem pro 1000 mg"
679
797
  CompositionTransformer.clear_substances
680
798
  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
799
+ specify { expect(composition.excipiens.name).to match /Excipiens/ }
800
+ specify { expect(composition.excipiens.qty).to eq 1000.0 }
801
+ specify { expect(composition.excipiens.unit).to eq 'mg' }
689
802
  end
690
- end
803
+
691
804
  context "should pass with 'etinoli 7900 U.I'" do
692
805
  string = "retinoli 7900 U.I."
693
806
  composition = ParseComposition.from_string(string)
@@ -702,7 +815,7 @@ describe ParseComposition do
702
815
  string = "absinthii herba 1.2 g pro charta"
703
816
  composition = ParseComposition.from_string(string)
704
817
  specify { expect(composition.source).to eq string }
705
- specify { expect(composition.substances.size).to eq 1 }
818
+ specify { expect(composition.substances.size).to eq 1 }
706
819
  specify { expect(composition.substances.first.name).to eq 'Absinthii Herba' }
707
820
  end
708
821
 
@@ -757,7 +870,7 @@ describe ParseComposition do
757
870
  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
871
  composition = ParseComposition.from_string(string)
759
872
  specify { expect(composition.source).to eq string }
760
- specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 8 : 7 }
873
+ specify { expect(composition.substances.size).to eq 7 }
761
874
  e104 = composition.substances.find{ |x| x.name.eql?('E 104') }
762
875
 
763
876
  specify { expect(e104.name).to eq 'E 104' }
@@ -773,9 +886,6 @@ describe ParseComposition do
773
886
  specify { expect(composition.substances.last.name).to eq 'E 171' }
774
887
  end
775
888
 
776
-
777
- if RunMostImportantParserTests
778
-
779
889
  context "should parse a Praeparatio with a label/galenic form?" do
780
890
  string = "Praeparatio cryodesiccata: pollinis allergeni extractum 25'000 U.: urtica dioica"
781
891
  composition = ParseComposition.from_string(string)
@@ -851,7 +961,7 @@ Corresp. 5190 kJ pro 1 l."
851
961
  composition = ParseComposition.from_string(line_1)
852
962
 
853
963
  composition = ParseComposition.from_string(line_1)
854
- specify { expect(composition.substances.size).to eq 3}
964
+ specify { expect(composition.substances.size).to eq 3 }
855
965
  specify { expect(composition.label).to eq 'I' }
856
966
  specify { expect(composition.label_description).to eq 'Glucoselösung' }
857
967
  dihydricum = composition.substances.find{ |x| /dihydricum/i.match(x.name) }
@@ -890,7 +1000,7 @@ Corresp. 5190 kJ pro 1 l."
890
1000
  context "should return correct substance ut (IKSNR 44744)" do
891
1001
  string = "zuclopenthixolum 2 mg ut zuclopenthixoli dihydrochloridum, excipiens pro compresso obducto."
892
1002
  composition = ParseComposition.from_string(string)
893
- specify { expect(composition.substances.size).to eq ExcipiensIs_a_Substance ? 2 : 1}
1003
+ specify { expect(composition.substances.size).to eq 1}
894
1004
  specify { expect(composition.substances.first.name).to eq 'Zuclopenthixolum' }
895
1005
  specify { expect(composition.substances.first.qty).to eq 2.0}
896
1006
  specify { expect(composition.substances.first.salts.size).to eq 1}
@@ -937,7 +1047,7 @@ Corresp. 5190 kJ pro 1 l."
937
1047
  context "should return correct substance for 'E 120'" do
938
1048
  string = "E 120"
939
1049
  composition = ParseComposition.from_string(string)
940
- substance = composition.substances.first
1050
+ substance = composition.substances.first
941
1051
  specify { expect(substance.name).to eq string }
942
1052
  specify { expect(substance.qty).to eq nil }
943
1053
  specify { expect(substance.unit).to eq nil }
@@ -961,21 +1071,19 @@ Corresp. 5190 kJ pro 1 l."
961
1071
  specify { expect(substance.unit).to eq 'µg' }
962
1072
  end
963
1073
 
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
1074
+ context "should return correct substance Rote Filmtablett 54819 Beriplast" do
1075
+ string = "A) Rote Filmtablette: estradiolum 1 mg ut estradiolum hemihydricum, excipiens pro compresso obducto"
1076
+ string = "estradiolum 1 mg ut estradiolum hemihydricum, excipiens pro compresso obducto"
1077
+ composition = ParseComposition.from_string(string)
1078
+ substance = composition.substances.first
1079
+ specify { expect(composition.substances.size).to eq 1 }
1080
+ # specify { expect(composition.substances.last.name).to eq 'Obducto' }
1081
+ specify { expect(substance.name).to eq 'Estradiolum' }
1082
+ specify { expect(composition.substances.first.salts.first.name).to eq 'Estradiolum Hemihydricum' }
1083
+ specify { expect(substance.cdose.to_s).to eq "" }
1084
+ specify { expect(substance.qty).to eq 1.0}
1085
+ specify { expect(substance.unit).to eq 'mg' }
1086
+ end
979
1087
 
980
1088
  context "should return correct composition for containing ut IKSNR 613" do
981
1089
  string = 'aluminium ut aluminii hydroxidum hydricum ad adsorptionem'
@@ -1001,7 +1109,6 @@ Corresp. 5190 kJ pro 1 l."
1001
1109
  specify { expect(haemagglutininum.unit).to eq 'µg' }
1002
1110
  end
1003
1111
 
1004
- if RunSpecificTests
1005
1112
  context "should return correct composition for containing parenthesis in substance name abd 40 U. (e.g IKSNR 613)" do
1006
1113
  string = 'virus poliomyelitis typus 1 inactivatum (D-Antigen) 40 U.'
1007
1114
  composition = ParseComposition.from_string(string)
@@ -1171,9 +1278,9 @@ if RunSpecificTests
1171
1278
  specify { expect(glucosum.name).to eq 'Glucosum Anhydricum' }
1172
1279
  specify { expect(glucosum.qty.to_f).to eq 150.0}
1173
1280
  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 }
1281
+ specify { expect(compositions[0].substances.size).to eq 3 }
1282
+ specify { expect(compositions[1].substances.size).to eq 5 } # should have glycerolum, natrii oleas, aqua
1283
+ specify { expect(compositions[2].substances.size).to eq 4 }
1177
1284
  specify { expect(compositions[1].source).to eq line_2}
1178
1285
  specify { expect(compositions[2].source).to eq line_3}
1179
1286
  specify { expect(compositions[3].source).to eq line_4}
@@ -1209,7 +1316,7 @@ if RunSpecificTests
1209
1316
 
1210
1317
  end
1211
1318
 
1212
- end
1319
+
1213
1320
 
1214
1321
  describe ParseUtil::HandleSwissmedicErrors do
1215
1322
  context 'should handle fixes' do
@@ -1239,7 +1346,7 @@ describe ParseUtil::HandleSwissmedicErrors do
1239
1346
  end
1240
1347
 
1241
1348
  end
1242
- end if RunSpecificTests
1349
+ end
1243
1350
 
1244
1351
  describe ParseComposition do
1245
1352
  context "should parse a complex composition" do
@@ -1264,5 +1371,5 @@ describe ParseComposition do
1264
1371
  }
1265
1372
  at_exit { puts "Testing whether #{nr} composition lines can be parsed. Found #{@nrErrors} errors in #{(Time.now - start_time).to_i} seconds" }
1266
1373
 
1267
- end if RunAllCompositionsTests
1268
- end
1374
+ end
1375
+ end if RunAllCompositionsTests