var test = require('tape'),
  b64 = require('../lib/b64'),
	checks = [
		'a',
		'aa',
		'aaa',
		'hi',
		'hi!',
		'hi!!',
		'sup',
		'sup?',
		'sup?!'
	],
	res;

test('convert to base64 and back', function (t) {
  t.plan(checks.length);

  for (var i = 0; i < checks.length; i++) {
    var check = checks[i],
      b64Str,
      arr,
      str;

    b64Str = b64.fromByteArray(map(check, function (char) { return char.charCodeAt(0); }));

    arr = b64.toByteArray(b64Str);
    str = map(arr, function (byte) { return String.fromCharCode(byte); }).join('');

    t.equal(check, str, 'Checked ' + check);
  }

});

function map (arr, callback) {
	var res = [],
    kValue,
    mappedValue;

	for (var k = 0, len = arr.length; k < len; k++) {
		if ((typeof arr === 'string' && !!arr.charAt(k))) {
			kValue = arr.charAt(k);
			mappedValue = callback(kValue, k, arr);
			res[k] = mappedValue;
		} else if (typeof arr !== 'string' && k in arr) {
			kValue = arr[k];
			mappedValue = callback(kValue, k, arr);
			res[k] = mappedValue;
		}
	}
	return res;
}