/***************************************************************************** * * Copyright (c) 2003-2005 Kupu Contributors. All rights reserved. * * This software is distributed under the terms of the Kupu * License. See LICENSE.txt for license text. For a list of Kupu * Contributors see CREDITS.txt. * *****************************************************************************/ // $Id: test_beforeunload.js,v 1.1.1.1 2005/08/30 17:10:23 dwinter Exp $ // Test form beforeUnload processing // The handler is careful not to use any global variables, so we have // to work a bit to find out its class. var BeforeUnloadHandler = window.onbeforeunload.tool.constructor; function KupuBeforeUnloadTestCase() { this.name = 'KupuBeforeUnloadTestCase'; function Submit(index) { return ''; } // Field types to test this.INPUTTEXT = ''; this.INPUTCLIENT = ''; this.TEXTAREA = ''; this.RADIO = '1-10 years old \ 11 years old\ 12-120 years old'; this.BUTTON = ''; this.CHECKBOX = 'Uncheck me
\ check me'; this.FILE = ''; this.HIDDEN = ''; this.HIDDEN = '
'+this.HIDDEN+'
'; this.IMAGE = ''; this.PASSWORD = ''; this.RESET = ''; this.SUBMIT = Submit(''); this.SELECTONE = ''; this.SELECTONEA = ''; this.SELECTMULTIPLE = ''; this.FORM1 = '
'+this.INPUTTEXT+Submit(1)+'
'; this.FORM2 = '
'+this.RADIO+Submit(2)+'
'; this.FORM3 = '
'+this.SELECTMULTIPLE+Submit(3)+'
'; this.FORMS = '
'+this.FORM1+this.FORM2+'
'+this.FORM3; } KupuBeforeUnloadTestCase.prototype = new TestCase; Class = KupuBeforeUnloadTestCase.prototype; var BeforeUnloadHandler = window.onbeforeunload.tool.constructor; Class.setUp = function() { this.bu = new BeforeUnloadHandler(); }; Class.tearDown = function() { window.onbeforeunload = null; }; Class.setHtml = function(fragment) { var testdiv = document.getElementById('testdiv'); testdiv.innerHTML = fragment; }; Class.assertNotChanged = function(id) { var field = document.getElementById(id); //this.debug("element "+id+" is "+field+" type "+field.type); this.assertFalse(this.bu.isElementChanged(field), "field not changed"); } Class.assertChanged = function(id, newvalue) { var field = document.getElementById(id); //this.debug("element "+id+" is "+field+" type "+field.type); if (newvalue) field.value = newvalue; this.assertTrue(this.bu.isElementChanged(field), "field changed"); } Class.simpleFieldTest = function(fragment, id, value) { this.setHtml(fragment); if (value) { this.assertChanged(id, value); } else { this.assertNotChanged(id); } } Class.testInputField = function() { this.simpleFieldTest(this.INPUTTEXT, "INPUTTEXT"); this.simpleFieldTest(this.INPUTTEXT, "INPUTTEXT", 37); } Class.testClientIgnored = function() { var id = "INPUTTEXT2"; this.setHtml(this.INPUTCLIENT); this.assertNotChanged(id); var field = document.getElementById(id); field.value = 25; this.assertNotChanged(id); // Give the field a name and then we pick up the change field.name = "ANINPUT"; this.assertChanged(id); } Class.testTextArea = function() { this.simpleFieldTest(this.TEXTAREA, "TEXTAREA"); this.simpleFieldTest(this.TEXTAREA, "TEXTAREA", 37); } Class.testRadio = function() { this.setHtml(this.RADIO); this.assertNotChanged("radio1"); this.assertNotChanged("radio2"); this.assertNotChanged("radio3"); document.getElementById("radio3").checked = true; this.assertChanged("radio1"); this.assertNotChanged("radio2"); this.assertChanged("radio3"); } Class.testButton = function() { this.simpleFieldTest(this.BUTTON, "BUTTON"); } Class.testCheck = function() { this.setHtml(this.CHECKBOX); this.assertNotChanged("chk1"); this.assertNotChanged("chk2"); document.getElementById("chk1").checked = false; document.getElementById("chk2").checked = true; this.assertChanged("chk1"); this.assertChanged("chk2"); document.getElementById("chk1").checked = true; document.getElementById("chk2").checked = false; this.assertNotChanged("chk1"); this.assertNotChanged("chk2"); } Class.testFile = function() { this.simpleFieldTest(this.FILE, "FILE"); // Cannot modify file from javascript, so no way to test changed // field. } Class.testHidden = function() { this.simpleFieldTest(this.HIDDEN, "HIDDEN"); var form = document.getElementById("FORMHIDDEN"); this.bu.addForms(form); this.assertChanged("HIDDEN", "37"); } Class.testImage = function() { this.simpleFieldTest(this.IMAGE, "IMAGE"); } Class.testPassword = function() { this.simpleFieldTest(this.PASSWORD, "PASSWORD"); this.simpleFieldTest(this.PASSWORD, "PASSWORD", "hidden"); } Class.testReset = function() { this.simpleFieldTest(this.RESET, "RESET"); } Class.testSubmit = function() { this.simpleFieldTest(this.SUBMIT, "SUBMIT"); } Class.testSelectOne = function() { this.setHtml(this.SELECTONE); // select with no default starts with first element selected. this.assertNotChanged("SELECTONE"); var field = document.getElementById("SELECTONE"); field.options[1].selected = true; this.assertChanged("SELECTONE"); field.options[0].selected = true; this.assertNotChanged("SELECTONE"); } Class.testSelectOneA = function() { this.setHtml(this.SELECTONEA); this.assertNotChanged("SELECTONE"); var field = document.getElementById("SELECTONE"); field.options[2].selected = true; this.assertChanged("SELECTONE"); field.options[1].selected = true; this.assertNotChanged("SELECTONE"); } Class.testSelectMultiple = function() { this.setHtml(this.SELECTMULTIPLE); this.assertNotChanged("SELECTMULTIPLE"); var field = document.getElementById("SELECTMULTIPLE"); field.options[2].selected = true; this.assertChanged("SELECTMULTIPLE"); field.options[2].selected = false; this.assertNotChanged("SELECTMULTIPLE"); field.options[1].selected = false; this.assertChanged("SELECTMULTIPLE"); } Class.testForm1 = function() { this.setHtml(this.FORM1); this.assertNotChanged("FORM1"); document.getElementById("INPUTTEXT").value = "37"; this.assertChanged("FORM1"); } Class.testAddForm = function() { this.setHtml(this.FORMS); var form = document.getElementById("FORM1"); this.bu.addForms(form); this.assertEquals(1, this.bu.forms.length); this.assertFalse(this.bu.isAnyFormChanged(form), "form not changed"); document.getElementById("radio3").checked = true; this.assertFalse(this.bu.isAnyFormChanged(form), "form not changed"); document.getElementById("INPUTTEXT").value = "37"; this.assertTrue(this.bu.isAnyFormChanged(form), "form changed"); } Class.testAddRemoveForm = function() { this.setHtml(this.FORMS); var div = document.getElementById("DIV1"); this.bu.addForms(null); this.assertEquals(0, this.bu.forms.length); this.bu.addForms(div); this.assertEquals(2, this.bu.forms.length); var form = document.getElementById("FORM1"); this.bu.addForms(form); this.assertEquals(2, this.bu.forms.length); this.bu.removeForms(form); this.assertEquals(1, this.bu.forms.length); var form3 = document.getElementById("FORM3"); this.bu.addForms(form3); this.assertEquals(2, this.bu.forms.length); this.bu.removeForms(div); this.assertEquals(1, this.bu.forms.length); this.bu.removeForms(null); this.assertEquals(1, this.bu.forms.length); } Class.testSubmit = function() { this.setHtml(this.FORMS); var form1 = document.getElementById("FORM1"); var form2 = document.getElementById("FORM3"); var form3 = document.getElementById("FORM3"); var div = document.getElementById("DIV1"); this.bu.addForms(div); this.assertEquals(this.bu.execute(), undefined); document.getElementById("INPUTTEXT").value = "37"; this.assertEquals(this.bu.execute(), this.bu.message); window.onbeforeunload = this.bu.execute; this.bu.onsubmit(); this.assertEquals(this.bu.execute(), undefined); } Class.testHandlers = function() { this.setHtml(this.FORMS); var form1 = document.getElementById("FORM1"); var form2 = document.getElementById("FORM3"); var form3 = document.getElementById("FORM3"); var div = document.getElementById("DIV1"); this.bu.addForms(div); function Handler() { return "called!"; } this.bu.addHandler(Handler); this.assertEquals(this.bu.execute(), Handler()); } Class.testIdOverride = function() { this.setHtml(this.FORMS); var form = document.getElementById("FORM1"); this.bu.addForms(form); document.getElementById("INPUTTEXT").value = "37"; this.assertTrue(this.bu.execute()); this.bu.chkId['INPUTTEXT'] = function() { return false; } this.assertFalse(this.bu.execute()); }