require 'test/minirunit'
test_check "Test Symbol:"

# Should not be able to dup, clone or create a symbol
test_exception() {
  :hej.dup
}
test_exception() {
  :hej.clone
}
test_exception(NameError) {
  Symbol.new
}

# Tainting or freezing a symbol is ignored

s = :hej
test_ok(! s.tainted?)
test_equal(s, s.taint)
test_ok(! s.tainted?)

test_ok(! s.frozen?)
test_equal(s, s.freeze)
test_ok(! s.frozen?)

# Symbol#id2name, Fixnum#id2name

s = :alpha
test_ok("alpha", s.id2name)
id = s.to_i
test_ok("alpha", id.id2name)


x = :froboz
test_exception(TypeError) {
  def x.foo(other)
    "fools"
  end
}

# add some 1.8 tests from Rubicon
test_equal(':"hello world"', 'hello world'.intern.inspect)
test_equal(':"with \" char"', 'with " char'.intern.inspect)
test_equal(':"with \\\\ \" chars"', 'with \ " chars'.intern.inspect)

test_equal(Array, Symbol.all_symbols.class)
Symbol.all_symbols.each do |sym|
  test_equal(Symbol, sym.class)
end

test_equal(Symbol.all_symbols, Symbol.all_symbols.uniq)

symbols1 = Symbol.all_symbols
s1 = "jruby_unique_symbol_1".intern
s2 = "jruby_unique_symbol_2".intern
symbols2 = Symbol.all_symbols

res = symbols2 - symbols1

test_equal(2, res.size)
test_ok(res.member?(s1))
test_ok(res.member?(s2))


# extra inspect tests for 1.8
pairs = []
pairs << ['$',    ':"$"'   ]
pairs << ['$$',   ':$$'    ]
pairs << ['$$$',  ':"$$$"' ]
pairs << ['$0',   ':$0'    ]
pairs << ['$00',  ':"$00"' ]
pairs << ['$1',   ':$1'    ]
pairs << ['$11',  ':$11'   ]
pairs << ['$1L',  ':"$1L"' ]
pairs << ['$-',   ':$-'    ]
pairs << ['$--',  ':"$--"' ]
pairs << ['$-_',  ':$-_'   ]
pairs << ['$-I',  ':$-I'   ]
pairs << ['$-II', ':"$-II"']
pairs << ['$@',   ':$@'    ]
pairs << ['$@@',  ':"$@@"' ]
pairs << ['@@',   ':"@@"'  ]
pairs << ['@@F',  ':@@F'   ]
pairs << ['@@Foo_Bar', ':@@Foo_Bar']
pairs << ['@',    ':"@"'   ]
pairs << ['@F',   ':@F'    ]
pairs << ['@Foo_Bar', ':@Foo_Bar']
pairs << ['<',    ':<'     ]
pairs << ['>',    ':>'     ]
pairs << ['<<',   ':<<'    ]
pairs << ['>>',   ':>>'    ]
pairs << ['<<<',  ':"<<<"' ]
pairs << ['>>>',  ':">>>"' ]
pairs << ['<=',   ':<='    ]
pairs << ['<==',  ':"<=="' ]
pairs << ['<=>',  ':<=>'   ]
pairs << ['=',    ':"="'   ]
pairs << ['==',   ':=='    ]
pairs << ['===',  ':==='   ]
pairs << ['====', ':"===="']
pairs << ['*',    ':*'     ]
pairs << ['**',   ':**'    ]
pairs << ['***',  ':"***"' ]
pairs << ['+',    ':+'     ]
pairs << ['-',    ':-'     ]
pairs << ['+@',   ':+@'    ]
pairs << ['-@',   ':-@'    ]
pairs << ['++',   ':"++"'  ]
pairs << ['|',    ':|'     ]
pairs << ['||',   ':"||"'  ]
pairs << ['[]',   ':[]'    ]
pairs << ['[]=',  ':[]='   ]
pairs << ['[[',   ':"[["'  ]
pairs << ['foobar', ':foobar']
pairs << ['foo bar', ':"foo bar"']
pairs << ['foobar!', ':foobar!']
pairs << ['Foobar!', ':"Foobar!"']


for pair in pairs
  str, insp = pair
  test_equal(str.intern.inspect, insp)
end

#test non-symbol strings are quoted when inspected
test_equal(:"123".inspect, ":\"123\"")


test_equal(:"abc".inspect, ":abc")
test_equal(:"abc#{1 + 2 + 3}".inspect, ":abc6")
test_equal(:"abc#{7 + 8 + 9}#{1 + 2 + 3}".inspect, ":abc246")

#Creating a singleton from Symbol should yield: "TypeError: no virtual class for Symbol"
test_exception(TypeError) { class << :abc ; end }