#!/usr/bin/env ruby
require File.dirname(__FILE__)+'/test_helper'

if RUBY_VERSION < "1.9"
	exit
end

class MessagePackTestEncoding < Test::Unit::TestCase
	def self.it(name, &block)
		define_method("test_#{name}", &block)
	end

	it "US-ASCII" do
		check_unpack "abc".force_encoding("US-ASCII")
	end

	it "UTF-8 ascii" do
		check_unpack "abc".force_encoding("UTF-8")
	end

	it "UTF-8 mbstr" do
		check_unpack "\xE3\x81\x82".force_encoding("UTF-8")
	end

	it "UTF-8 invalid" do
		check_unpack "\xD0".force_encoding("UTF-8")
	end

	it "ASCII-8BIT" do
		check_unpack "\xD0".force_encoding("ASCII-8BIT")
	end

	it "EUC-JP" do
		x = "\xA4\xA2".force_encoding("EUC-JP")
		check_unpack(x)
	end

	it "EUC-JP invalid" do
		begin
			"\xD0".force_encoding("EUC-JP").to_msgpack
			assert(false)
		rescue Encoding::InvalidByteSequenceError
			assert(true)
		end
	end

	private
	def check_unpack(str)
		if str.encoding.to_s == "ASCII-8BIT"
			should_str = str.dup.force_encoding("UTF-8")
		else
			should_str = str.encode("UTF-8")
		end

		raw = str.to_msgpack
		r = MessagePack.unpack(str.to_msgpack)
		assert_equal(r.encoding.to_s, "UTF-8")
		assert_equal(r, should_str.force_encoding("UTF-8"))

		if str.valid_encoding?
			sym = str.to_sym
			r = MessagePack.unpack(sym.to_msgpack)
			assert_equal(r.encoding.to_s, "UTF-8")
			assert_equal(r, should_str.force_encoding("UTF-8"))
		end
	end
end