The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title> Unit test file</title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <script src="../../lib/prototype.js" type="text/javascript"></script>
  <script src="../../src/util.js" type="text/javascript"></script>
  <script src="../../src/formated.js" type="text/javascript"></script>
  <script src="../../src/formatedinput.js" type="text/javascript"></script>
  <script src="../../src/formatedarea.js" type="text/javascript"></script>
  <script src="../../lib/unittest.js" type="text/javascript"></script>
  <link rel="stylesheet" href="../test.css" type="text/css" />
</head>
<body>

<h1>FormatedInput input Unit Tests</h1>

<!-- Log output -->
<div id="testlog"> </div>

<div id="formated">
<form>
<textarea id="hello" cols="50" rows="10"></textarea>
</form>

<!-- Tests follow -->
<script type="text/javascript" language="javascript" charset="utf-8">
//<![CDATA[

var area1 = { C: [ { cols: 20, format: '{2x20}', full_re: '.{0,20}\n.{0,20}\n',
                     leading: '', length: 42, rows: 2 
                 } ] 
            };
var area2 = { C: [ { cols: 30, format: '{4x30}', full_re: '.{0,30}\n.{0,30}\n.{0,30}\n',
                     leading: '', length: 63, rows: 3, streamlines: 1
                 } ] 
            };

function mk_event ( key ) {
    return { charCode: key.charCodeAt( 0 ) };
}

new Test.Unit.Runner({
    // --------------------------------------------------------------
    testArea: function() { with(this) {

        var fi = new FormatedArea( 'hello', area1 );
        assert( fi );
        assertInstanceOf( FormatedArea, fi );

        var E = fi.input();
        assertNotNull( E, "Got the input" );

        // --------------------------------------------
        E.value = '';
        E.selectionStart = E.selectionEnd = 0;

        var e = mk_event( 'H' );
        var def = fi.keypress( e );
        assert( !def, "FI did it" );
        assertEqual( 'H', E.value, "One key" );

        e = mk_event( '0' );
        def = fi.keypress( e );
        assert( !def, "FI did it" );
        assertEqual( 'H0', E.value, "Two key" );

        e = mk_event( 'h' );
        def = fi.keypress( e );
        assert( !def, "FI did it" );
        assertEqual( 'H0h', E.value, "Red key" );

        e = mk_event( ' ' );
        fi.keypress( e );
        assertEqual( 'H0h ', E.value, "Blue key" );

        e = mk_event( '0' );
        fi.keypress( e );
        assertEqual( 'H0h 0', E.value, "Blue key" );

        e = mk_event( 'H' );
        fi.keypress( e );
        assertEqual( 'H0h 0H', E.value, "More key" );

        e = mk_event( '0' );
        fi.keypress( e );
        assertEqual( 'H0h 0H0', E.value, "Last key" );


        e = mk_event( "\n" );

        fi.keypress( e );
        assertEqual( 'H0h 0H0\n', E.value, "Enter key" );

        e = mk_event( "b" );
        fi.keypress( e );
        assertEqual( 'H0h 0H0\nb', E.value, "Next line" );

        e = mk_event( "o" );
        fi.keypress( e );
        assertEqual( 'H0h 0H0\nbo', E.value, "Next line" );

        e = mk_event( "n" );
        fi.keypress( e );
        assertEqual( 'H0h 0H0\nbon', E.value, "Next line" );

        e = mk_event( "k" );
        fi.keypress( e );
        assertEqual( 'H0h 0H0\nbonk', E.value, "Next line" );

        e = mk_event( "\n" );
        fi.keypress( e );
        assertEqual( 'H0h 0H0\nbonk', E.value, "No more lines" );

        e = mk_event( "\n" );
        fi.keypress( e );
        assertEqual( 'H0h 0H0\nbonk', E.value, "No more lines" );

        // --------------------------------------------
        E.value = "01234567890123456789";

        e = mk_event( "0" );
        fi.keypress( e );
        assertEqual( '01234567890123456789\n0', E.value, "Line limit" );
        
        fi.keypress( e );
        assertEqual( '01234567890123456789\n00', E.value, "End of the line" );

        e = mk_event( "1" );
        fi.keypress( e );
        assertEqual( '01234567890123456789\n001', E.value, "New line" );

        // --------------------------------------------
        E.value = "012345678901234567890\n";

        e = mk_event( "0" );
        fi.keypress( e );
        assertEqual( '012345678901234567890\n0', E.value, "New line (edge case)" );

        // --------------------------------------------
        E.value = "01234567890123456789\n0123456789012345678";

        e = mk_event( "0" );
        fi.keypress( e );
        assertEqual( '01234567890123456789\n01234567890123456780', E.value, "Last char" );

        fi.keypress( e );
        assertEqual( '01234567890123456789\n01234567890123456780', E.value, "Already full" );


        // --------------------------------------------
        E.value = "012345678901234567890\n01234567890123456789";

        E.selectionStart = E.selectionEnd = 5;
        e = mk_event( "0" );
        fi.keypress( e );
        assertEqual( '012340567890123456789\n01234567890123456789', E.value, "Insert into full line" );

        // --------------------------------------------
        // insert
        E.value =    "012345678901234567890";
        E.selectionStart = E.selectionEnd = 5;
        
        e = mk_event( "0" );
        fi.keypress( e );
        assertEqual( '012340567890123456789', E.value, "Full line" );

        E.selectionStart = 5;
        E.selectionEnd = 6;
        
        e = mk_event( "x" );
        def = fi.keypress( e );
        assert( !def, "Don't bubble up" );
        assertEqual( '01234x567890123456789', E.value, "Substitute one" );

        E.selectionStart = 5;
        E.selectionEnd = 11;
        
        e = mk_event( "y" );
        def = fi.keypress( e );
        assert( !def, "Don't bubble up" );
        assertEqual( '01234y0123456789', E.value, "Substitute one" );

        // --------------------------------------------
        E.value = "012345678901234567890\n012345678901234567890";

        E.selectionStart = E.selectionEnd = 5;
        e = mk_event( "\n" );
        fi.keypress( e );
        assertEqual( '012345678901234567890\n012345678901234567890', E.value, "Insert into full line" );

        E.selectionStart = 5;
        E.selectionEnd = 10;

        def = fi.keypress( e );
        assert( !def, "Don't bubble up" );
        assertEqual( '012345678901234567890\n012345678901234567890', E.value, "Insert into full line" );

        E.selectionStart = 15;
        E.selectionEnd = 25;

        def = fi.keypress( e );
        assert( !def, "Don't bubble up" );
        assertEqual( '012345678901234567890\n012345678901234567890', E.value, "Insert into full line" );

        e = mk_event( "0" );
        E.selectionStart = 15;
        E.selectionEnd = 25;

        def = fi.keypress( e );
        assert( !def, "Don't bubble up" );
        assertEqual( '0123456789012340\n012345678901234567890', E.value, "Insert into full line" );

        // --------------------------------------------
        // insert newline
        E.value = "012345678901234567890";
        E.selectionStart = E.selectionEnd = 5;
        
        e = mk_event( "\n" );
        fi.keypress( e );
        assertEqual( '01234\n5678901234567890', E.value, "Insert newline" );

        E.value = "012345678901234567890";
        E.selectionStart = 5;
        E.selectionEnd = 6;
        
        e = mk_event( "\n" );
        fi.keypress( e );
        assertEqual( '01234\n678901234567890', E.value, "Insert newline" );
        fi.keypress( e );
        assertEqual( '01234\n678901234567890', E.value, "But only one" );


        // --------------------------------------------
        // insert char
        E.value = "012345678901234567890";
        E.selectionStart = E.selectionEnd = 5;
        
        e = mk_event( "e" );
        fi.keypress( e );
        assertEqual( '01234e567890123456789', E.value, "Insert char" );


        // --------------------------------------------
        // backspace
        e = mk_event( "\b" );

        E.value = "1234 1234\n1234 1234";
        E.selectionStart = E.selectionEnd = 10;
        var ret = fi.keypress( e );
        assertEqual( true, ret, E.value, "Remove a newline; normal" );

        E.value = "1234 6789 1234\n4321 1234 1234";
        E.selectionStart = E.selectionEnd = 15;
        ret = fi.keypress( e );
        assertEqual( false, ret, "We handled it" );
        assertEqual( "1234 6789 12344321\n 1234 1234",
                     E.value, "Remove a newline; joined" );

        assertEqual( 14, E.selectionStart, " ... before newline" );

        ret = fi.keypress( e );
        assertEqual( true, ret, " ... which would be a normal backspace" );

        E.selectionStart = E.selectionEnd = 0;
        ret = fi.keypress( e );
        assertEqual( true, ret, "Backspace at begining" );

        // backspace + deleting
        E.value = "1234 6789 1234\n4321 1234 1234";
        E.selectionStart = 15;
        E.selectionEnd = 20;
        ret = fi.keypress( e );
        assertEqual( false, ret, "We handled it" );
        assertEqual( "1234 6789 1234\n1234 1234",
                     E.value, "Remove a newline; drop + joined" );

        // backspace + deleting
        E.value = "1234 9876\n4321 honk 1234";
        E.selectionStart = 8;
        E.selectionEnd = 16;
        ret = fi.keypress( e );
        assertEqual( false, ret, "We didn't handle it" );
        assertEqual( "1234 9876\nonk 1234",
                     E.value, "Remove a newline; drop + joined" );

        // --------------------------------------------
        // Delete
        e = mk_event( " " );
        e.charCode = 0;
        e.which = 0;
        e.keyCode = Event['DOM_VK_DELETE']
        assertNotEqual( 0, e.keyCode, "DOM_VK_DELETE" );

        E.value = "1234 1234\n1234 1234";
        E.selectionStart = E.selectionEnd = 5;
        ret = fi.keypress( e );
        assertEqual( "1234 234\n1234 1234",
                     E.value, "Delete after" );

        E.value = "1234 6789\nhonk zipr";
        E.selectionStart = 5;
        E.selectionEnd = 9;
        ret = fi.keypress( e );
        assertEqual( "1234 \nhonk zipr",
                     E.value, "Delete block" );

        E.value = "1234 6789\nhonk zipr";
        E.selectionStart = 5;
        E.selectionEnd = 12;
        ret = fi.keypress( e );
        assertEqual( "1234 6789\nnk zipr",
                     E.value, "Delete across lines" );

    }},

    // --------------------------------------------------------------
    testStreamlines: function() { with(this) {
        fb_log( 'testStreamlines' );
        var fi = new FormatedArea( 'hello', area2 );
        assert( fi );
        assert( fi.streamlines );
        assertInstanceOf( FormatedArea, fi );

        var E = fi.input();
        assertNotNull( E, "Got the input" );

        var e = mk_event( "\b" );

        E.value = "1234 1234\n1234 1234";
        E.selectionStart = E.selectionEnd = 10;
        fi.keypress( e );
        assertEqual( '1234 12341\n234 1234', E.value, "Streamlines remove a newline" );
        assertEqual( 9, E.selectionStart, " ... and positioned before it" );
        var ret = fi.keypress( e );
        assertEqual( true, ret, " ... which would be a normal backspace" );

        E.selectionStart = E.selectionEnd = 11;
        fi.keypress( e );
        assertEqual( '1234 123412\n34 1234', E.value, "Streamlines shifts the newline" );

        E.selectionStart = E.selectionEnd = 12;
        fi.keypress( e );
        assertEqual( '1234 1234123\n4 1234', E.value, "Streamlines shifts the newline" );

        E.selectionStart = E.selectionEnd = 13;
        fi.keypress( e );
        assertEqual( '1234 12341234\n 1234', E.value, "Streamlines shifts the newline" );

        E.selectionStart = E.selectionEnd = 14;
        fi.keypress( e );
        assertEqual( '1234 12341234 \n1234', E.value, "Streamlines shifts the newline" );


        E.value = "1234 6789 1234 6789 1234 67890\nhonk";
        E.selectionStart = E.selectionEnd = 31;
        fi.keypress( e );
        assertEqual( "1234 6789 1234 6789 1234 67890\nhonk", E.value, "Streamlines didn't do anything" );



    }},

    // --------------------------------------------------------------
    test_last: function() {
        Element.hide( $( "formated" ) );
        this.assertNotVisible( $( 'formated' ) );
    }

});
//]]></script>



</body>
</html>