/******************************************************************************
* Copyright (c) 2014 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.observable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.sapphire.ObservableMap;
import org.eclipse.sapphire.tests.EventLog;
import org.eclipse.sapphire.tests.SapphireTestCase;
import org.eclipse.sapphire.util.MapFactory;
import org.junit.Test;
/**
* Tests ObservableMap.
*
* @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
*/
public final class ObservableMapTests extends SapphireTestCase
{
@Test
public void Size() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
assertEquals( 0, observable.size() );
base.put( "a", "1" );
base.put( "b", "2" );
assertEquals( 2, observable.size() );
base.clear();
assertEquals( 0, observable.size() );
}
@Test
public void Empty() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
assertTrue( observable.isEmpty() );
base.put( "a", "1" );
assertFalse( observable.isEmpty() );
base.clear();
assertTrue( observable.isEmpty() );
}
@Test
public void ContainsKey() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
assertTrue( observable.containsKey( "a" ) );
assertFalse( observable.containsKey( "b" ) );
assertFalse( observable.containsKey( "1" ) );
assertFalse( observable.containsKey( new Object() ) );
}
@Test
public void ContainsValue() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
assertTrue( observable.containsValue( "1" ) );
assertFalse( observable.containsValue( "2" ) );
assertFalse( observable.containsValue( "a" ) );
assertFalse( observable.containsValue( new Object() ) );
}
@Test
public void EntrySet() throws Exception
{
final Map<String,String> base = new LinkedHashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
base.put( "b", "2" );
base.put( "c", "3" );
final EventLog log = new EventLog();
observable.attach( log );
final Iterator<Map.Entry<String,String>> itr = observable.entrySet().iterator();
assertTrue( itr.hasNext() );
final Map.Entry<String,String> a = itr.next();
assertEquals( "a", a.getKey() );
assertEquals( "1", a.getValue() );
assertTrue( itr.hasNext() );
final Map.Entry<String,String> b = itr.next();
assertEquals( "b", b.getKey() );
assertEquals( "2", b.getValue() );
itr.remove();
assertEquals( MapFactory.start().add( "a", "1" ).add( "c", "3" ).result(), base );
assertEquals( 1, log.size() );
assertTrue( itr.hasNext() );
final Map.Entry<String,String> c = itr.next();
assertEquals( "c", c.getKey() );
assertEquals( "3", c.getValue() );
assertFalse( itr.hasNext() );
}
@Test
public void Get() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
base.put( "b", "2" );
assertEquals( "1", observable.get( "a" ) );
assertEquals( "2", observable.get( "b" ) );
assertNull( observable.get( "c" ) );
}
@Test
public void Put() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
base.put( "b", "2" );
final EventLog log = new EventLog();
observable.attach( log );
observable.put( "c", "3" );
assertEquals( MapFactory.start().add( "a", "1" ).add( "b", "2" ).add( "c", "3" ).result(), base );
assertEquals( 1, log.size() );
log.clear();
observable.put( "b", "22" );
assertEquals( MapFactory.start().add( "a", "1" ).add( "b", "22" ).add( "c", "3" ).result(), base );
assertEquals( 1, log.size() );
log.clear();
observable.put( "c", "3" );
assertEquals( MapFactory.start().add( "a", "1" ).add( "b", "22" ).add( "c", "3" ).result(), base );
assertEquals( 0, log.size() );
}
@Test
public void PutAll() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
base.put( "b", "2" );
final EventLog log = new EventLog();
observable.attach( log );
observable.putAll( MapFactory.<String,String>start().add( "c", "3" ).add( "d", "4" ).result() );
assertEquals( MapFactory.start().add( "a", "1" ).add( "b", "2" ).add( "c", "3" ).add( "d", "4" ).result(), base );
assertEquals( 1, log.size() );
log.clear();
observable.putAll( MapFactory.<String,String>start().add( "a", "11" ).add( "b", "22" ).result() );
assertEquals( MapFactory.start().add( "a", "11" ).add( "b", "22" ).add( "c", "3" ).add( "d", "4" ).result(), base );
assertEquals( 1, log.size() );
log.clear();
observable.putAll( MapFactory.<String,String>start().add( "c", "3" ).add( "d", "4" ).result() );
assertEquals( MapFactory.start().add( "a", "11" ).add( "b", "22" ).add( "c", "3" ).add( "d", "4" ).result(), base );
assertEquals( 0, log.size() );
}
@Test
public void Remove() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
base.put( "b", "2" );
base.put( "c", "3" );
final EventLog log = new EventLog();
observable.attach( log );
observable.remove( "b" );
assertEquals( MapFactory.start().add( "a", "1" ).add( "c", "3" ).result(), base );
assertEquals( 1, log.size() );
log.clear();
observable.remove( "d" );
assertEquals( MapFactory.start().add( "a", "1" ).add( "c", "3" ).result(), base );
assertEquals( 0, log.size() );
}
@Test
public void Clear() throws Exception
{
final Map<String,String> base = new HashMap<String,String>();
final ObservableMap<String,String> observable = new ObservableMap<String,String>( base );
base.put( "a", "1" );
base.put( "b", "2" );
base.put( "c", "3" );
final EventLog log = new EventLog();
observable.attach( log );
observable.clear();
assertTrue( base.isEmpty() );
assertEquals( 1, log.size() );
log.clear();
observable.clear();
assertTrue( base.isEmpty() );
assertEquals( 0, log.size() );
}
}