#
# testing rufus-json
#
# Fri Jul 31 13:05:37 JST 2009
#

require 'test/unit'
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
require 'rufus/json'
require 'rubygems'

JSON_LIB = ARGV[0]
require JSON_LIB

if JSON_LIB == 'active_support'
  Rufus::Json.backend = :active
else
  Rufus::Json.detect_backend
end

puts
puts "  #{Rufus::Json.backend.to_s.upcase} (#{JSON_LIB})"
puts


class DoTest < Test::Unit::TestCase

  #def setup
  #end

  def test_backend

    target = JSON_LIB.to_sym
    target = :active if target == :active_support
    target = :json if JSON_LIB == 'json/pure'

    assert_equal target, Rufus::Json.backend
  end

  def test_decode

    assert_equal [ 1, 2, 3 ], Rufus::Json.decode("[ 1, 2, 3 ]")
  end

  def test_encode

    assert_equal "[1,2,3]", Rufus::Json.encode([ 1, 2, 3 ])
  end

  def test_load

    assert_equal [ 1, 2, 3 ], Rufus::Json.load("[ 1, 2, 3 ]")
  end

  def test_dump

    assert_equal "[1,2,3]", Rufus::Json.dump([ 1, 2, 3 ])
  end

  def test_encode_value # instead of object or array

    assert_equal 'null', Rufus::Json.encode(nil)
    assert_equal 'true', Rufus::Json.encode(true)
    assert_equal 'false', Rufus::Json.encode(false)
    assert_equal '1.0', Rufus::Json.encode(1.0)
    assert_equal '"Capitaine Haddock"', Rufus::Json.encode('Capitaine Haddock')
  end

  def test_dup

    d0 = { 'id' => 'nada' }
    d1 = { :id => :nada }
    #d2 = { :id => { :tree => [ 'nada', {}, [] ] } }

    assert_equal({ 'id' => 'nada' }, Rufus::Json.dup(d0))
    assert_equal({ 'id' => 'nada' }, Rufus::Json.dup(d1))
    #assert_equal({ 'id' => 'tree' }, Rufus::Json.dup(d2))
  end

  def test_deep_nesting

    s = "{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{}}}}}}}}}}}}}}}}}}}}}}"

    h = {}
    p = h
    (1..21).each do |i|
      p['a'] = {}
      p = p['a']
    end

    assert_equal(s, Rufus::Json.encode(h))
    assert_equal(h, Rufus::Json.decode(s))
  end

  def test_parser_error

    return if Rufus::Json.backend == :active

    s = '{foo:cx1234}'

    assert_raise Rufus::Json::ParserError do
      p Rufus::Json.decode(s)
    end
  end

  def test_json_atoms

    [
      [ '1', 1 ],
      [ '1.1', 1.1 ],
      [ '1.1e10', 1.1e10 ],
      [ '1.1E10', 1.1e10 ],
      [ '1.1E-10', 1.1e-10 ],
      [ '"a"', 'a' ],
      [ 'true', true ],
      [ 'false', false ],
      [ 'null', nil ]
    ].each do |s, v|
      assert_equal v, Rufus::Json.decode(s)
    end
  end

  def test_pretty_encode

    s = Rufus::Json.pretty_encode(
      { 'a' => 'b', 'e' => [ 1, 2, 3 ], 'c' => { 'd' => true } })

    assert(s.index("\n")) if JSON_LIB != 'active_support'
  end
end