<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
  <head> 
    <title>Native Base64 Tests</title> 
    <script src="../include/util.js"></script> 
    <script src="../include/webutil.js"></script> 
    <script src="../include/base64.js"></script> 
  </head> 
  <body> 
        <h1>Native Base64 Tests</h1> 
 
        <br> 
        Messages:<br> 
        <textarea id="debug" style="font-size: 9px;" cols=80 rows=25></textarea> 
    
        <br>
  </body> 
 
<script> 
    function debug(str) {
        console.log(str);
        cell = $D('debug');
        cell.innerHTML += str + "\n";
        cell.scrollTop = cell.scrollHeight;
    }

    function assertRun(code, result) {
        try {
            var actual = eval(code);
        } catch (exc) {
            debug("FAIL: '" + code + "' threw an exception");
            fail += 1;
            return false;
        }
        if (actual !== result) {
            debug("FAIL: '" + code + "' returned '" + actual + "', expected '" + result + "'");
            fail += 1;
            return false;
        }
        debug("PASS: '" + code + "' returned expected '" + result +"'");
        pass += 1;
        return true;
    }

    function Base64_decode(data) {
        var arr = Base64.decode (data);
        return arr.map(function (num) {
            return String.fromCharCode(num); } ).join('');

    }

    window.onload = function() {
        var str;
        debug('onload');
        fail = 0;
        pass = 0;
        assertRun('window.btoa("hello world")', 'aGVsbG8gd29ybGQ=');
        assertRun('window.btoa("a")', 'YQ==');
        assertRun('window.btoa("ab")', 'YWI=');
        assertRun('window.btoa("abc")', 'YWJj');
        assertRun('window.btoa("abcd")', 'YWJjZA==');
        assertRun('window.btoa("abcde")', 'YWJjZGU=');
        assertRun('window.btoa("abcdef")', 'YWJjZGVm');
        assertRun('window.btoa("abcdefg")', 'YWJjZGVmZw==');
        assertRun('window.btoa("abcdefgh")', 'YWJjZGVmZ2g=');

        assertRun('window.atob("aGVsbG8gd29ybGQ=")', 'hello world');
        assertRun('Base64_decode("aGVsbG8gd29ybGQ=")', 'hello world');
        assertRun('window.atob("YQ==")', 'a');
        assertRun('Base64_decode("YQ==")', 'a');
        assertRun('window.atob("YWI=")', 'ab');
        assertRun('Base64_decode("YWI=")', 'ab');
        assertRun('window.atob("YWJj")', 'abc');
        assertRun('Base64_decode("YWJj")', 'abc');
        assertRun('window.atob("YWJjZA==")', 'abcd');
        assertRun('Base64_decode("YWJjZA==")', 'abcd');
        assertRun('window.atob("YWJjZGU=")', 'abcde');
        assertRun('Base64_decode("YWJjZGU=")', 'abcde');
        assertRun('window.atob("YWJjZGVm")', 'abcdef');
        assertRun('Base64_decode("YWJjZGVm")', 'abcdef');

        assertRun('typeof window.btoa', 'function');
        assertRun('window.btoa("")', '');
        assertRun('window.btoa(null)', '');
        assertRun('window.atob(window.btoa(window))', window.toString()); // "[object DOMWindow]"
        assertRun('window.btoa("\\u0080\\u0081")', 'gIE=');

        debug("Tests failed: " + fail);
        debug("Tests passed: " + pass);
    }
</script>