oddb2xml 2.0.6 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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