require 'msgpack'

@up = MessagePack::Unpacker.new

def check(bytes, should)
	puts "----"
	@up.reset
	src = bytes.pack('C*')
	ret = @up.execute(src, 0)
	if ret != src.length
		puts "** EXTRA BYTES **"
	end
	puts bytes.map{|x|"%x"%x}.join(' ')
	data = @up.data
	p data
	if data != should
		puts "** TEST FAILED **"
		p should
	end
end

# SimpleValue
check([
	0x93, 0xc0, 0xc2, 0xc3,
], [nil,false,true])

# Fixnum
check([
	0x92,
		0x93, 0x00, 0x40, 0x7f,
		0x93, 0xe0, 0xf0, 0xff,
], [[0,64,127], [-32,-16,-1]])

# FixArray
check([
	0x92,
		0x90,
		0x91,
			0x91, 0xc0,
], [[],[[nil]]])


# FixRaw
check([
	0x94,
		0xa0,
		0xa1, ?a,
		0xa2, ?b, ?c,
		0xa3, ?d, ?e, ?f,
], ["","a","bc","def"])

# FixMap
check([
	0x82,
		0xc2, 0x81,
			0xc0, 0xc0,
		0xc3, 0x81,
			0xc0, 0x80,
], {false=>{nil=>nil}, true=>{nil=>{}}})

# unsigned int
check([
	0x99,
		0xcc, 0,
		0xcc, 128,
		0xcc, 255,
		0xcd, 0x00, 0x00,
		0xcd, 0x80, 0x00,
		0xcd, 0xff, 0xff,
		0xce, 0x00, 0x00, 0x00, 0x00,
		0xce, 0x80, 0x00, 0x00, 0x00,
		0xce, 0xff, 0xff, 0xff, 0xff,
], [0, 128, 255, 0, 32768, 65535, 0, 2147483648, 4294967295])

# signed int
check([
	0x99,
		0xd0, 0,
		0xd0, 128,
		0xd0, 255,
		0xd1, 0x00, 0x00,
		0xd1, 0x80, 0x00,
		0xd1, 0xff, 0xff,
		0xd2, 0x00, 0x00, 0x00, 0x00,
		0xd2, 0x80, 0x00, 0x00, 0x00,
		0xd2, 0xff, 0xff, 0xff, 0xff,
], [0, -128, -1, 0, -32768, -1, 0, -2147483648, -1])

# raw
check([
	0x96,
		0xda, 0x00, 0x00,
		0xda, 0x00, 0x01, ?a,
		0xda, 0x00, 0x02, ?a, ?b,
		0xdb, 0x00, 0x00, 0x00, 0x00,
		0xdb, 0x00, 0x00, 0x00, 0x01, ?a,
		0xdb, 0x00, 0x00, 0x00, 0x02, ?a, ?b,
], ["", "a", "ab", "", "a", "ab"])

# array
check([
	0x96,
		0xdc, 0x00, 0x00,
		0xdc, 0x00, 0x01, 0xc0,
		0xdc, 0x00, 0x02, 0xc2, 0xc3,
		0xdd, 0x00, 0x00, 0x00, 0x00,
		0xdd, 0x00, 0x00, 0x00, 0x01, 0xc0,
		0xdd, 0x00, 0x00, 0x00, 0x02, 0xc2, 0xc3
], [[], [nil], [false,true], [], [nil], [false,true]])

# map
check([
	0x96,
		0xde, 0x00, 0x00,
		0xde, 0x00, 0x01, 0xc0, 0xc2,
		0xde, 0x00, 0x02, 0xc0, 0xc2, 0xc3, 0xc2,
		0xdf, 0x00, 0x00, 0x00, 0x00,
		0xdf, 0x00, 0x00, 0x00, 0x01, 0xc0, 0xc2,
		0xdf, 0x00, 0x00, 0x00, 0x02, 0xc0, 0xc2, 0xc3, 0xc2,
], [{}, {nil=>false}, {true=>false, nil=>false}, {}, {nil=>false}, {true=>false, nil=>false}])