require File.dirname(__FILE__) + '/spec_helper'
class Person
def initialize(first, last)
@first, @last = first, last
end
attr_reader :first, :last
end
describe SlippersParser do
before(:each) do
@parser = SlippersParser.new
end
it 'should parse the subtemplate found within the delimiters' do
template = Slippers::Engine.new('template for this')
template_with_underscore = Slippers::Engine.new('template with underscore')
predefined_templates = {:template => template, :template_with_underscore => template_with_underscore, :template_2 => template}
template_group = Slippers::TemplateGroup.new(:templates => predefined_templates)
@parser.parse('$template()$').eval(nil, template_group).should eql('template for this')
@parser.parse('$template_2()$').eval(nil, template_group).should eql('template for this')
@parser.parse('Stuff before $template()$ and after').eval(nil, template_group).should eql('Stuff before template for this and after')
@parser.parse('then there is $template_with_underscore()$').eval(nil, template_group).should eql('then there is template with underscore')
end
it 'should apply the attribute to a subtemplate when parsing it' do
person = OpenStruct.new({:name => Person.new('fred', 'flinstone')})
subtemplate = Slippers::Engine.new('Hello $first$ $last$')
template_group = Slippers::TemplateGroup.new(:templates => {:person => subtemplate})
@parser.parse('$name:person()$').eval(person, template_group).should eql('Hello fred flinstone')
end
it 'should parse an anonymous subtemplate' do
@parser.parse('$people:{template for this $name$}$').eval(:people => {:name => 'fred'}).should eql('template for this fred')
@parser.parse('$people:{template for this "$name$"}$').eval(:people => {:name => 'fred'}).should eql('template for this "fred"')
@parser.parse('${template for this $name$}$').eval(:name => 'fred').should eql('template for this fred')
end
it "should apply a list of objects to subtemplates" do
people = [ Person.new('fred', 'flinstone'), Person.new('barney', 'rubble') ]
subtemplate = Slippers::Engine.new('this is $first$ $last$ ')
template_group = Slippers::TemplateGroup.new(:templates => {:person => subtemplate})
object_to_render = OpenStruct.new({:people => people})
@parser.parse('$people:person()$').eval(object_to_render, template_group).should eql("this is fred flinstone this is barney rubble ")
end
it "should call the default missing handler when the subtemplate cannot be found and there is no template group" do
Slippers::Engine::MISSING_HANDLER.call.should eql('')
@parser.parse("This is the unknown template $unknown()$!").eval(Person.new('fred', 'flinstone')).should eql("This is the unknown template !")
@parser.parse("This is the unknown template $first:unknown()$!").eval(Person.new('fred', 'flinstone')).should eql("This is the unknown template !")
end
it "should call the missing handler when the subtemplate cannot be found" do
missing_handler = lambda { |template| "Warning: the template [#{template}] is missing" }
template_group = Slippers::TemplateGroup.new(:missing_template_handler => missing_handler)
@parser.parse("This is the unknown template $unknown()$!").eval(:object, template_group).should eql("This is the unknown template Warning: the template [unknown] is missing!")
@parser.parse("This is the unknown template $first:unknown()$!").eval(Person.new('fred', 'flinstone'), template_group).should eql("This is the unknown template Warning: the template [unknown] is missing!")
end
it "should parse the file template from the template group" do
template_group = Slippers::TemplateGroupDirectory.new(['spec/views'])
name = OpenStruct.new({:first => 'fred', :last => 'flinestone'})
people = OpenStruct.new({:fred => name})
@parser.parse("should parse $person/name()$").eval(name, template_group).should eql("should parse fred flinestone")
@parser.parse("should parse $fred:person/name()$").eval(people, template_group).should eql("should parse fred flinestone")
end
it 'should render the object if the keyword it is used' do
supergroup = Slippers::TemplateGroup.new(:templates => {:bold => Slippers::Engine.new("$it$")})
subgroup = Slippers::TemplateGroup.new(:templates => {}, :super_group => supergroup)
@parser.parse("$it$").eval("Sarah", subgroup).should eql('Sarah')
@parser.parse("$name:bold()$").eval({:name => "Sarah"}, subgroup).should eql('Sarah')
end
end