require File.expand_path(File.dirname(__FILE__) + '/test_helper')
class QuickstartTest < Test::Unit::TestCase
  def test_hello_world
    context = Radius::Context.new
    context.define_tag "hello" do |tag|
      "Hello #{tag.attr['name'] || 'World'}!"
    end
    parser = Radius::Parser.new(context)
    assert_equal "
Hello World!
", parser.parse('
')
    assert_equal "Hello John!
", parser.parse('
')
  end
  
  def test_example_2
    require 'redcloth'
    context = Radius::Context.new
    context.define_tag "textile" do |tag|
      contents = tag.expand
      RedCloth.new(contents).to_html
    end
    parser = Radius::Parser.new(context)
    assert_equal "Hello World!
", parser.parse('Hello **World**!')
  end
  
  def test_nested_example
    context = Radius::Context.new
    
    context.define_tag "stooge" do |tag|
      content = ''
      ["Larry", "Moe", "Curly"].each do |name|
        tag.locals.name = name
        content << tag.expand
      end
      content
    end
    
    context.define_tag "stooge:name" do |tag|
      tag.locals.name
    end
    
    parser = Radius::Parser.new(context)
    
    template = <<-TEMPLATE
    TEMPLATE
    
    output = <<-OUTPUT
    OUTPUT
    
    assert_equal output, parser.parse(template)
  end
  
  class User
    attr_accessor :name, :age, :email
  end
  def test_exposing_objects_example
    parser = Radius::Parser.new
    
    parser.context.define_tag "count", :for => 1
    assert_equal "1", parser.parse("")
    
    user = User.new
    user.name, user.age, user.email = "John", 29, "john@example.com"
    parser.context.define_tag "user", :for => user, :expose => [ :name, :age, :email ]
    assert_equal "John", parser.parse("")
    
    assert_equal "John", parser.parse("")
  end
  
  class LazyContext < Radius::Context
    def tag_missing(tag, attr, &block)
      "ERROR: Undefined tag `#{tag}' with attributes #{attr.inspect}"
    end
  end
  def test_tag_missing_example
    parser = Radius::Parser.new(LazyContext.new, :tag_prefix => 'lazy')
    output = %{ERROR: Undefined tag `weird' with attributes {"value"=>"true"}}
    assert_equal output, parser.parse('')
  end
  
  def test_tag_globals_example
    parser = Radius::Parser.new
    
    parser.context.define_tag "inc" do |tag|
      tag.globals.count ||= 0
      tag.globals.count += 1
      ""
    end
    
    parser.context.define_tag "count" do |tag|
      tag.globals.count || 0
    end
    
    assert_equal "0 1", parser.parse(" ")
  end
  
  class Person
    attr_accessor :name, :friend
    def initialize(name)
      @name = name
    end
  end
  def test_tag_locals_and_globals_example
    jack = Person.new('Jack')
    jill = Person.new('Jill')
    jack.friend = jill
    jill.friend = jack
    
    context = Radius::Context.new do |c|
      c.define_tag "jack" do |tag|
        tag.locals.person = jack
        tag.expand
      end
      c.define_tag "jill" do |tag|
        tag.locals.person = jill
        tag.expand
      end
      c.define_tag "name" do |tag|
        tag.locals.person.name rescue tag.missing!
      end
      c.define_tag "friend" do |tag|
        tag.locals.person = tag.locals.person.friend rescue tag.missing!
        tag.expand
      end
    end
    
    parser = Radius::Parser.new(context, :tag_prefix => 'r')
    
    assert_equal "Jack", parser.parse('') #=> "Jack"
    assert_equal "Jill", parser.parse('') #=> "Jill"
    assert_equal "Jack", parser.parse('') #=> "Jack"
    assert_equal "Jack", parser.parse('') #=> "Jack"
    assert_equal "Jack and Jill", parser.parse(' and ') #=> "Jack and Jill"
    assert_raises(Radius::UndefinedTagError) { parser.parse('') } # raises a Radius::UndefinedTagError exception
  end
  
end