# frozen_string_literal: true require 'spec_helper' describe Banzai::Filter::MathFilter do include FilterSpecHelper it 'leaves regular inline code unchanged' do input = "2+2" doc = filter(input) expect(doc.to_s).to eq input end it 'removes surrounding dollar signs and adds class code, math and js-render-math' do doc = filter("$2+2$") expect(doc.to_s).to eq '2+2' end it 'only removes surrounding dollar signs' do doc = filter("test $2+2$ test") before = doc.xpath('descendant-or-self::text()[1]').first after = doc.xpath('descendant-or-self::text()[3]').first expect(before.to_s).to eq 'test ' expect(after.to_s).to eq ' test' end it 'only removes surrounding single dollar sign' do doc = filter("test $$2+2$$ test") before = doc.xpath('descendant-or-self::text()[1]').first after = doc.xpath('descendant-or-self::text()[3]').first expect(before.to_s).to eq 'test $' expect(after.to_s).to eq '$ test' end it 'adds data-math-style inline attribute to inline math' do doc = filter('$2+2$') code = doc.xpath('descendant-or-self::code').first expect(code['data-math-style']).to eq 'inline' end it 'adds class code and math to inline math' do doc = filter('$2+2$') code = doc.xpath('descendant-or-self::code').first expect(code[:class]).to include("code") expect(code[:class]).to include("math") end it 'adds js-render-math class to inline math' do doc = filter('$2+2$') code = doc.xpath('descendant-or-self::code').first expect(code[:class]).to include("js-render-math") end # Cases with faulty syntax. Should be a no-op it 'ignores cases with missing dolar sign at the end' do input = "test $2+2 test" doc = filter(input) expect(doc.to_s).to eq input end it 'ignores cases with missing dolar sign at the beginning' do input = "test 2+2$ test" doc = filter(input) expect(doc.to_s).to eq input end it 'ignores dollar signs if it is not adjacent' do input = '

We check strictly $2+2 and 2+2$

' doc = filter(input) expect(doc.to_s).to eq input end it 'ignores dollar signs if they are inside another element' do input = '

We check strictly $2+2$

' doc = filter(input) expect(doc.to_s).to eq input end # Display math it 'adds data-math-style display attribute to display math' do doc = filter('
2+2
') pre = doc.xpath('descendant-or-self::pre').first expect(pre['data-math-style']).to eq 'display' end it 'adds js-render-math class to display math' do doc = filter('
2+2
') pre = doc.xpath('descendant-or-self::pre').first expect(pre[:class]).to include("js-render-math") end it 'ignores code blocks that are not math' do input = '
2+2
' doc = filter(input) expect(doc.to_s).to eq input end it 'requires the pre to contain both code and math' do input = '
2+2
' doc = filter(input) expect(doc.to_s).to eq input end it 'dollar signs around to display math' do doc = filter('$
2+2
$') before = doc.xpath('descendant-or-self::text()[1]').first after = doc.xpath('descendant-or-self::text()[3]').first expect(before.to_s).to eq '$' expect(after.to_s).to eq '$' end end