require "spec_helper"
RSpec.describe Asciimath2UnitsML do
it "converts an AsciiMath string to MathML + UnitsML" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(mm*s^-2)"
INPUT
OUTPUT
end
it "deals with non-Ascii units and prefixes" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(um)"
INPUT
1umumumummicrouμ$mu$µ
OUTPUT
end
it "does not insert space before non-alphabetic units" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(degK)" + 1 "unitsml(prime)"
INPUT
1°KkelvinKKthermodynamic temperature+1′minute (minute of arc)′′plane angleangle
OUTPUT
end
it "deals with sqrt units" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(sqrt(Hz))"
INPUT
1HzHz^0.5√HzHz
OUTPUT
end
it "deals with kg and g" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(kg)" + 1 "unitsml(g)"
INPUT
1kgkilogramkgkgkilokkkkmass+1ggramgg
OUTPUT
end
it "deals with non-metric" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(hp)"
INPUT
1hphorsepowerhphppower
OUTPUT
end
it "deals with duplicate units" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(kg*s^-2)" xx 9 "unitsml(kg*s^-2)"
INPUT
1kg·s−2kg*s^-2
kg·s
−2kg·s−2kilokkkk×9kg·s−2
OUTPUT
end
it "deals with notational variants" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
9 "unitsml(degK)" + 10 "unitsml(K)"
INPUT
9°KkelvinKKthermodynamic temperature+10K
OUTPUT
end
it "deals with prefixed units" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
9 "unitsml(mbar)"
INPUT
9mbarmillibarmbarmbarmillimmmm
OUTPUT
end
it "deals with standalone prefixes" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
"unitsml(p-)" "unitsml(da-)"
INPUT
ppicoppppdadekadadadada
OUTPUT
end
it "deals with units division" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
9 "unitsml(A*C^3)" + 13 "unitsml(A/C^-3)"
INPUT
9A·C3A*C^3
A·C
3A·C3+13A/C−3
OUTPUT
end
it "converts MathML to MatML + UnitsML" do
input = <<~INPUT
32+5×7unitsml(kg^-2)
INPUT
output = <<~OUTPUT
32+5×7kg−2kg^-2
kg
−2kg−2kilokkkk
OUTPUT
expect(xmlpp(Asciimath2UnitsML::Conv.new().MathML2UnitsML(input).to_xml)).to be_equivalent_to xmlpp(output)
expect(xmlpp(Asciimath2UnitsML::Conv.new().MathML2UnitsML(Nokogiri::XML(input)).to_xml)).to be_equivalent_to xmlpp(output)
end
it "raises error for illegal unit" do
expect{xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))}.to raise_error(Rsec::SyntaxError)
12 "unitsml(que?)"
INPUT
end
it "initialises multiplier" do
expect(xmlpp(Asciimath2UnitsML::Conv.new(multiplier: "\u00d7").Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(kg*s^-2)"
INPUT
1kg×s−2kg*s^-2
kg×s
−2kg×s−2kilokkkk
OUTPUT
expect(xmlpp(Asciimath2UnitsML::Conv.new(multiplier: :space).Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(kg*s^-2)"
INPUT
1kgs−2kg*s^-2
kg s
−2kgs−2kilokkkk
OUTPUT
expect(xmlpp(Asciimath2UnitsML::Conv.new(multiplier: :nospace).Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
1 "unitsml(kg*s^-2)"
INPUT
1kgs−2kg*s^-2
kgs
−2kgs−2kilokkkk
OUTPUT
end
it "deals with dimension decomposition with like units" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
9 "unitsml(mW*cm^(-2))"
INPUT
9mW·cm−2mW*cm^-2
mW·cm
−2mW·cm−2millimmmmcenticccc
OUTPUT
end
it "deals with quantity input" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
9 "unitsml(m, quantity: NISTq103)"
INPUT
9mmetermmposition vector
OUTPUT
end
it "deals with name input" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
9 "unitsml(cal_th/cm^2, name: langley)"
INPUT
9calth/cm2langley
cal
th
·cm
−2calth·cm−2centicccc
OUTPUT
end
it "deals with symbol input" do
expect(xmlpp(Asciimath2UnitsML::Conv.new().Asciimath2UnitsML(<<~INPUT))).to be_equivalent_to xmlpp(<<~OUTPUT)
9 "unitsml(m, symbol: La)" + 10 "unitsml(cm*s^-2, symbol: cm cdot s^-2)"
INPUT
9Lametermm+10cm⋅s−2cm*s^-2
cm·s
−2cm·s−2centicccc
OUTPUT
end
end