/****************************************************************************** * Copyright (c) 2016 Oracle * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Konstantin Komissarchik - initial implementation and ongoing maintenance ******************************************************************************/ package org.eclipse.sapphire.tests.modeling.events; import java.util.ArrayList; import java.util.List; import org.eclipse.sapphire.Event; import org.eclipse.sapphire.Listener; import org.eclipse.sapphire.Property; import org.eclipse.sapphire.modeling.Status; import org.eclipse.sapphire.tests.SapphireTestCase; import org.junit.Test; /** * Tests delivery of property events. * * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a> */ public final class TestPropertyEvents extends SapphireTestCase { private List<Event> monitor( final TestElement element ) { return monitor( element, null ); } private List<Event> monitor( final TestElement element, final String path ) { final List<Event> events = new ArrayList<Event>(); final Listener listener = new Listener() { @Override public void handle( final Event event ) { events.add( event ); } }; if( path == null ) { element.attach( listener ); for( Property property : element.properties() ) { property.attach( listener ); } } else { element.attach( listener, path ); } return events; } @Test public void testEventsValuePropertyPlain() throws Exception { try( TestElement element = TestElement.TYPE.instantiate() ) { final List<Event> events = monitor( element ); assertEquals( 0, events.size() ); element.getValuePlain().text(); element.setValuePlain( "a" ); assertEquals( 1, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getValuePlain(), null, "a" ); events.clear(); element.getValuePlain().validation(); element.setValuePlain( "b" ); assertEquals( 1, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getValuePlain(), "a", "b" ); events.clear(); element.getValuePlain().enabled(); element.setValuePlain( "c" ); assertEquals( 1, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getValuePlain(), "b", "c" ); } } @Test public void testEventsValuePropertyConstrained() throws Exception { try( TestElement element = TestElement.TYPE.instantiate() ) { final List<Event> events = monitor( element ); assertEquals( 0, events.size() ); element.getValueConstrained().text(); element.setValueConstrained( "a" ); assertEquals( 1, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getValueConstrained(), null, "a" ); events.clear(); element.getValueConstrained().validation(); element.setValueConstrained( "b" ); assertEquals( 1, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getValueConstrained(), "a", "b" ); events.clear(); element.setValueConstrained( null ); assertEquals( 2, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getValueConstrained(), "b", null ); assertPropertyValidationEvent( events.get( 1 ), element.getValueConstrained(), Status.createOkStatus(), Status.createErrorStatus( "Value constrained must be specified" ) ); events.clear(); element.getValueConstrained().enabled(); element.setValueConstrained( "c" ); assertEquals( 2, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getValueConstrained(), null, "c" ); assertPropertyValidationEvent( events.get( 1 ), element.getValueConstrained(), Status.createErrorStatus( "Value constrained must be specified" ), Status.createOkStatus() ); events.clear(); element.setEnablement( false ); assertEquals( 2, events.size() ); assertValuePropertyContentEvent( events.get( 0 ), element.getEnablement(), null, "false" ); assertPropertyEnablementEvent( events.get( 1 ), element.getValueConstrained(), true, false ); } } @Test public void testEventsListPropertyDescendents() throws Exception { try( TestElement element = TestElement.TYPE.instantiate() ) { final List<Event> events = monitor( element, "List/*" ); assertEquals( 0, events.size() ); final TestElement.ListEntry a = element.getList().insert(); assertEquals( 1, events.size() ); assertPropertyContentEvent( events.get( 0 ), element.getList() ); events.clear(); final TestElement.ListEntry b = element.getList().insert(); assertEquals( 1, events.size() ); assertPropertyContentEvent( events.get( 0 ), element.getList() ); events.clear(); a.setValue( "abc" ); b.setValue( "def" ); assertEquals( 2, events.size() ); assertPropertyContentEvent( events.get( 0 ), a.getValue() ); assertPropertyContentEvent( events.get( 1 ), b.getValue() ); events.clear(); element.getList().remove( a ); assertEquals( 1, events.size() ); assertPropertyContentEvent( events.get( 0 ), element.getList() ); events.clear(); final TestElement.ListEntry ba = b.getChildren().insert(); final TestElement.ListEntry bb = b.getChildren().insert(); assertEquals( 2, events.size() ); assertPropertyContentEvent( events.get( 0 ), b.getChildren() ); assertPropertyContentEvent( events.get( 1 ), b.getChildren() ); events.clear(); ba.setValue( "ghi" ); bb.setValue( "jkl" ); assertEquals( 2, events.size() ); assertPropertyContentEvent( events.get( 0 ), ba.getValue() ); assertPropertyContentEvent( events.get( 1 ), bb.getValue() ); } } @Test public void testEventsListPropertyPath() throws Exception { try( TestElement element = TestElement.TYPE.instantiate() ) { final List<Event> events = monitor( element, "List/Children/Value" ); assertEquals( 0, events.size() ); final TestElement.ListEntry a = element.getList().insert(); assertEquals( 1, events.size() ); assertPropertyContentEvent( events.get( 0 ), element.getList() ); events.clear(); final TestElement.ListEntry b = element.getList().insert(); assertEquals( 1, events.size() ); assertPropertyContentEvent( events.get( 0 ), element.getList() ); events.clear(); a.setValue( "abc" ); b.setValue( "def" ); assertEquals( 0, events.size() ); element.getList().remove( a ); assertEquals( 1, events.size() ); assertPropertyContentEvent( events.get( 0 ), element.getList() ); events.clear(); final TestElement.ListEntry ba = b.getChildren().insert(); final TestElement.ListEntry bb = b.getChildren().insert(); assertEquals( 2, events.size() ); assertPropertyContentEvent( events.get( 0 ), b.getChildren() ); assertPropertyContentEvent( events.get( 1 ), b.getChildren() ); events.clear(); ba.setValue( "ghi" ); bb.setValue( "jkl" ); assertEquals( 2, events.size() ); assertPropertyContentEvent( events.get( 0 ), ba.getValue() ); assertPropertyContentEvent( events.get( 1 ), bb.getValue() ); } } }