| /* | |
| * Copyright 2011 Google Inc. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not | |
| * use this file except in compliance with the License. You may obtain a copy of | |
| * the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
| * License for the specific language governing permissions and limitations under | |
| * the License. | |
| */ | |
| package com.google.gwt.editor.client; | |
| import com.google.gwt.core.client.GWT; | |
| import com.google.gwt.editor.client.SimpleBeanEditorTest.PersonEditorWithDelegate; | |
| import com.google.gwt.editor.client.SimpleBeanEditorTest.PersonEditorWithDelegateDriver; | |
| import com.google.gwt.editor.client.SimpleBeanEditorTest.PersonEditorWithOptionalAddressDriver; | |
| import com.google.gwt.editor.client.SimpleBeanEditorTest.PersonEditorWithOptionalAddressEditor; | |
| import com.google.gwt.editor.client.adapters.EditorSource; | |
| import com.google.gwt.editor.client.adapters.ListEditor; | |
| import com.google.gwt.editor.client.adapters.OptionalFieldEditor; | |
| import com.google.gwt.editor.client.adapters.SimpleEditor; | |
| import com.google.gwt.junit.client.GWTTestCase; | |
| import java.util.Collections; | |
| import java.util.List; | |
| /** | |
| * | |
| */ | |
| public class DirtyEditorTest extends GWTTestCase { | |
| @Override | |
| public String getModuleName() { | |
| return "com.google.gwt.editor.Editor"; | |
| } | |
| public void testDirty() { | |
| PersonEditor editor = new PersonEditor(); | |
| PersonEditorDriver driver = GWT.create(PersonEditorDriver.class); | |
| driver.initialize(editor); | |
| driver.edit(person); | |
| // Freshly-initialized should not be dirty | |
| assertFalse(driver.isDirty()); | |
| // Changing the Person object should not affect the dirty status | |
| person.setName("blah"); | |
| assertFalse(driver.isDirty()); | |
| editor.addressEditor.city.setValue("Foo"); | |
| assertTrue(driver.isDirty()); | |
| // Check that flushing doesn't clear the dirty state | |
| driver.flush(); | |
| assertTrue(driver.isDirty()); | |
| // Reset to original value | |
| editor.addressEditor.city.setValue("City"); | |
| assertFalse(driver.isDirty()); | |
| // Try a null value | |
| editor.managerName.setValue(null); | |
| assertTrue(driver.isDirty()); | |
| } | |
| public void testDirtyWithDelegate() { | |
| PersonEditorWithDelegate editor = new PersonEditorWithDelegate(); | |
| PersonEditorWithDelegateDriver driver = GWT.create(PersonEditorWithDelegateDriver.class); | |
| driver.initialize(editor); | |
| driver.edit(person); | |
| // Freshly-initialized should not be dirty | |
| assertFalse(driver.isDirty()); | |
| // Use the delegate to toggle the state | |
| editor.delegate.setDirty(true); | |
| assertTrue(driver.isDirty()); | |
| // Use the delegate to clear the state | |
| editor.delegate.setDirty(false); | |
| assertFalse(driver.isDirty()); | |
| // Check that the delegate has no influence over values | |
| editor.addressEditor.city.setValue("edited"); | |
| assertTrue(driver.isDirty()); | |
| editor.delegate.setDirty(false); | |
| assertTrue(driver.isDirty()); | |
| editor.delegate.setDirty(true); | |
| assertTrue(driver.isDirty()); | |
| } | |
| public void testDirtyWithOptionalEditor() { | |
| person.address = null; | |
| AddressEditor addressEditor = new AddressEditor(); | |
| PersonEditorWithOptionalAddressEditor editor = | |
| new PersonEditorWithOptionalAddressEditor(addressEditor); | |
| PersonEditorWithOptionalAddressDriver driver = | |
| GWT.create(PersonEditorWithOptionalAddressDriver.class); | |
| driver.initialize(editor); | |
| driver.edit(person); | |
| // Freshly-initialized should not be dirty | |
| assertFalse(driver.isDirty()); | |
| // Change the instance being edited | |
| Address a = new Address(); | |
| editor.address.setValue(a); | |
| assertTrue(driver.isDirty()); | |
| // Check restoration works | |
| editor.address.setValue(null); | |
| assertFalse(driver.isDirty()); | |
| } | |
| public void testEditResetsDirty() { | |
| PersonEditorWithDelegate editor = new PersonEditorWithDelegate(); | |
| PersonEditorWithDelegateDriver driver = GWT.create(PersonEditorWithDelegateDriver.class); | |
| driver.initialize(editor); | |
| driver.edit(person); | |
| // Freshly-initialized should not be dirty | |
| assertFalse(driver.isDirty()); | |
| editor.addressEditor.city.setValue("blah"); | |
| assertTrue(driver.isDirty()); | |
| driver.edit(person); | |
| assertFalse(driver.isDirty()); | |
| editor.delegate.setDirty(true); | |
| assertTrue(driver.isDirty()); | |
| driver.edit(person); | |
| assertFalse(driver.isDirty()); | |
| } | |
| public void testEditResetsDirtyReplacement() { | |
| Person person2 = new Person(); | |
| person2.setName("Pod"); | |
| PersonEditorWithDelegate editor = new PersonEditorWithDelegate(); | |
| PersonEditorWithDelegateDriver driver = GWT.create(PersonEditorWithDelegateDriver.class); | |
| driver.initialize(editor); | |
| driver.edit(person); | |
| editor.addressEditor.street.setValue("blah"); | |
| assertTrue(driver.isDirty()); | |
| driver.edit(person2); | |
| assertFalse(driver.isDirty()); | |
| } | |
| class Workgroup { | |
| private String label; | |
| String getLabel() { | |
| return label; | |
| } | |
| void setLabel(String label) { | |
| this.label = label; | |
| } | |
| private List<Person> people; | |
| List<Person> getPeople() { | |
| return people; | |
| } | |
| void setPeople(List<Person> people) { | |
| this.people = people; | |
| } | |
| } | |
| class WorkgroupEditor implements Editor<Workgroup> { | |
| SimpleEditor<String> label = SimpleEditor.of(); | |
| OptionalFieldEditor<List<Person>, ListEditor<Person, PersonEditor>> people = | |
| OptionalFieldEditor.of(ListEditor | |
| // The method type parameterization is needed by OpenJDK, please keep. | |
| .<Person, PersonEditor> of(new EditorSource<PersonEditor>() { | |
| @Override | |
| public PersonEditor create(int index) { | |
| return new PersonEditor(); | |
| } | |
| })); | |
| } | |
| interface WorkgroupEditorDriver extends SimpleBeanEditorDriver<Workgroup, WorkgroupEditor> { | |
| } | |
| /** | |
| * CompositeEditors have an implementation complication due to the EditorChain needing to patch | |
| * the composite editors into the hierarchy. | |
| */ | |
| public void testDirtyOptionalList() { | |
| WorkgroupEditorDriver driver = GWT.create(WorkgroupEditorDriver.class); | |
| WorkgroupEditor editor = new WorkgroupEditor(); | |
| driver.initialize(editor); | |
| Workgroup wg = new Workgroup(); | |
| driver.edit(wg); | |
| assertFalse(driver.isDirty()); | |
| editor.people.setValue(Collections.singletonList(person)); | |
| assertTrue(driver.isDirty()); | |
| } | |
| Person person; | |
| Address personAddress; | |
| Person manager; | |
| long now; | |
| @Override | |
| protected void gwtSetUp() throws Exception { | |
| personAddress = new Address(); | |
| personAddress.city = "City"; | |
| personAddress.street = "Street"; | |
| manager = new Person(); | |
| manager.name = "Bill"; | |
| person = new Person(); | |
| person.address = personAddress; | |
| person.name = "Alice"; | |
| person.manager = manager; | |
| person.localTime = now = System.currentTimeMillis(); | |
| } | |
| } |