spec/lib/hotcell/template_spec.rb in hotcell-0.1.0 vs spec/lib/hotcell/template_spec.rb in hotcell-0.2.0

- old
+ new

@@ -6,11 +6,12 @@ Hotcell.stub(:commands) { { 'include' => Class.new } } Hotcell.stub(:blocks) { { 'for' => Class.new } } end specify { described_class.parse('').should be_a described_class } - specify { described_class.parse('').options.values.map(&:keys).should == [['include'], ['for']] } + specify { described_class.parse('' + ).options.slice(:commands, :blocks).values.map(&:keys).should == [['include'], ['for']] } end describe '#syntax' do specify { described_class.new('').syntax.should be_a Hotcell::Joiner } specify { described_class.new('hello').syntax.should be_a Hotcell::Joiner } @@ -78,7 +79,56 @@ {{ i * j }} {{ end for }} {{ end for }} SOURCE ).render.gsub(/[\s\n]+/, ' ').strip.should == '4 3 2 1 8 6 4 2 12 9 6 3 16 12 8 4' } + + context 'method invokation' do + specify { described_class.parse("{{ [1, 2, 3][1] }}").render.should == '2' } + specify { described_class.parse("{{ [1, 2, 3][1..2] }}").render.should == '[2, 3]' } + specify { described_class.parse("{{ [1, 2, 3].last }}").render.should == '3' } + specify { described_class.parse("{{ [1, 2, 3]['last'] }}").render.should =~ /TypeError/ } + specify { described_class.parse("{{ { a: 1, b: 2 }['b'] }}").render.should == '2' } + specify { described_class.parse("{{ { count: 5, b: 7 }.count }}").render.should == '2' } + specify { described_class.parse("{{ { count: 5, b: 7 }.b }}").render.should == '7' } + specify { described_class.parse("{{ { count: 5, b: 7 }['count'] }}").render.should == '5' } + specify { described_class.parse("{{ { count: 5, b: 7 }['b'] }}").render.should == '7' } + specify { described_class.parse("{{ { count: 5, b: 7 }['size'] }}").render.should == '' } + specify { described_class.parse("{{ 'string'[1] }}").render.should == 't' } + specify { described_class.parse("{{ 'string'[1, 3] }}").render.should == 'tri' } + specify { described_class.parse("{{ 'string'.size }}").render.should == '6' } + specify { described_class.parse("{{ 'string'['size'] }}").render.should == '' } + end + end + + context 'escaping' do + specify { described_class.parse('{{ title }}').render( + title: '<h1>Title</h1>' + ).should == '<h1>Title</h1>' } + specify { described_class.parse('{{~ title }}').render( + title: '<h1>Title</h1>' + ).should == '<h1>Title</h1>' } + specify { described_class.parse('{{ if true }}<h1>Title</h1>{{ end }}').render( + title: '<h1>Title</h1>' + ).should == '<h1>Title</h1>' } + specify { described_class.parse('{{^ if true }}<h1>Title</h1>{{ end }}').render( + title: '<h1>Title</h1>' + ).should == '&lt;h1&gt;Title&lt;/h1&gt;' } + specify { described_class.parse('{{ if true }}{{ title }}{{ end }}').render( + title: '<h1>Title</h1>' + ).should == '<h1>Title</h1>' } + + context 'escape_tags' do + before { Hotcell.stub(:escape_tags) { true } } + + specify { described_class.parse('{{ title }}').render( + title: '<h1>Title</h1>' + ).should == '&lt;h1&gt;Title&lt;/h1&gt;' } + specify { described_class.parse('{{ if true }}{{ title }}{{ end }}').render( + title: '<h1>Title</h1>' + ).should == '&lt;h1&gt;Title&lt;/h1&gt;' } + specify { described_class.parse('{{ if true }}<h1>Title</h1>{{ end }}').render( + title: '<h1>Title</h1>' + ).should == '<h1>Title</h1>' } + end end end