# -*- coding: binary -*-
shared_examples_for 'an xor encoder' do |keysize|

	it "should encode one block" do
		# Yup it returns one of its arguments in an array... Because spoon.
		encoded, key = described_class.encode("A"*keysize, "A"*keysize)
		encoded.should eql("\x00"*keysize)

		encoded, key = described_class.encode("\x0f"*keysize, "\xf0"*keysize)
		encoded.should eql("\xff"*keysize)

		encoded, key = described_class.encode("\xf7"*keysize, "\x7f"*keysize)
		encoded.should eql("\x88"*keysize)
	end

	it "should encode multiple blocks" do
		2.upto 50 do |count|
			encoded, key = described_class.encode("\xf7"*keysize*count, "\x7f"*keysize)
			encoded.should eql("\x88"*keysize*count)
		end
	end

	if keysize > 1
		it "should deal with input lengths that aren't a multiple of keysize" do
			lambda {
				encoded, key = described_class.encode("A"*(keysize+1), "A"*keysize)
				encoded.should eql("\x00"*(keysize+1))
			}.should_not raise_error

			lambda {
				encoded, key = described_class.encode("A"*(keysize-1), "A"*keysize)
				encoded.should eql("\x00"*(keysize-1))
			}.should_not raise_error
		end
	end

end
