package com.ldbc.driver.util;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;
public class MapUtilsTest
{
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void shouldBeEqualAfterMapToPropertiesThenPropertiesToMap()
{
// Given
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
// When
Properties properties123 = MapUtils.mapToProperties( map123 );
Map<Integer,Integer> afterMap123 = MapUtils.propertiesToMap( properties123 );
// Then
assertThat( map123.size(), equalTo( afterMap123.size() ) );
assertThat( afterMap123.containsKey( 1 ), is( true ) );
assertThat( afterMap123.containsKey( 2 ), is( true ) );
assertThat( afterMap123.containsKey( 3 ), is( true ) );
assertThat( afterMap123.get( 1 ), equalTo( map123.get( 1 ) ) );
assertThat( afterMap123.get( 2 ), equalTo( map123.get( 2 ) ) );
assertThat( afterMap123.get( 3 ), equalTo( map123.get( 3 ) ) );
}
@Test
public void shouldNotCopyExcludedKeys()
{
// Given
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
Set<Integer> excludeKey2 = new HashSet<Integer>( Arrays.asList( new Integer[]{2} ) );
// When
Map<Integer,Integer> map13 = MapUtils.copyExcludingKeys( map123, excludeKey2 );
// Then
assertThat( map13.size(), is( 2 ) );
assertThat( map13.containsKey( 1 ), is( true ) );
assertThat( map13.containsKey( 2 ), is( false ) );
assertThat( map13.containsKey( 3 ), is( true ) );
}
@Test
public void shouldGetDefaultWhenKeyNotPresent()
{
// Given
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
// When
int key1Value = MapUtils.getDefault( map123, 1, 9 );
int key4Value = MapUtils.getDefault( map123, 4, 4 );
// Then
assertThat( key1Value, is( 1 ) );
assertThat( key4Value, is( 4 ) );
}
@Test
public void shouldMergeAllPropertiesToMapWithOverwrite()
{
// Given
Properties properties123 = new Properties();
properties123.put( 1, 1 );
properties123.put( 2, 2 );
properties123.put( 3, 3 );
// When
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 2 );
map123 = MapUtils.mergePropertiesToMap( properties123, map123, true );
// Then
assertThat( map123.size(), is( 3 ) );
assertThat( map123.get( 1 ), is( 1 ) );
assertThat( map123.get( 2 ), is( 2 ) );
assertThat( map123.get( 3 ), is( 3 ) );
}
@Test
public void shouldMergeAllPropertiesToMapWithoutOverwrite()
{
// Given
Properties properties123 = new Properties();
properties123.put( 1, 1 );
properties123.put( 2, 2 );
properties123.put( 3, 3 );
// When
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 2 );
map123 = MapUtils.mergePropertiesToMap( properties123, map123, false );
// Then
assertThat( map123.size(), is( 3 ) );
assertThat( map123.get( 1 ), is( 2 ) );
assertThat( map123.get( 2 ), is( 2 ) );
assertThat( map123.get( 3 ), is( 3 ) );
}
@Test
public void shouldMergeAllMapToPropertiesWithOverwrite()
{
// Given
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
// When
Properties properties123 = new Properties();
properties123.put( 1, 2 );
properties123 = MapUtils.mergeMapToProperties( map123, properties123, true );
// Then
assertThat( properties123.size(), is( 3 ) );
assertThat( (Integer) properties123.get( 1 ), is( 1 ) );
assertThat( (Integer) properties123.get( 2 ), is( 2 ) );
assertThat( (Integer) properties123.get( 3 ), is( 3 ) );
}
@Test
public void shouldMergeAllMapToPropertiesWithoutOverwrite()
{
// Given
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
// When
Properties properties123 = new Properties();
properties123.put( 1, 2 );
properties123 = MapUtils.mergeMapToProperties( map123, properties123, false );
// Then
assertThat( properties123.size(), is( 3 ) );
assertThat( (Integer) properties123.get( 1 ), is( 2 ) );
assertThat( (Integer) properties123.get( 2 ), is( 2 ) );
assertThat( (Integer) properties123.get( 3 ), is( 3 ) );
}
@Test
public void shouldMergeAllMapToMapWithOverwrite()
{
// Given
Map<Integer,Integer> map123 = new HashMap<Integer,Integer>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
// When
Map<Integer,Integer> newMap123 = new HashMap<>();
newMap123.put( 1, 2 );
newMap123 = MapUtils.mergeMaps( map123, newMap123, true );
// Then
assertThat( newMap123.size(), is( 3 ) );
assertThat( newMap123.get( 1 ), is( 2 ) );
assertThat( newMap123.get( 2 ), is( 2 ) );
assertThat( newMap123.get( 3 ), is( 3 ) );
}
@Test
public void shouldMergeAllMapToMapWithoutOverwrite()
{
// Given
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
// When
Map<Integer,Integer> newMap123 = new HashMap<>();
newMap123.put( 1, 2 );
newMap123 = MapUtils.mergeMaps( map123, newMap123, false );
// Then
assertThat( newMap123.size(), is( 3 ) );
assertThat( newMap123.get( 1 ), is( 1 ) );
assertThat( newMap123.get( 2 ), is( 2 ) );
assertThat( newMap123.get( 3 ), is( 3 ) );
}
@Test
public void shouldMergeAllMapToMapAndSumValuesByOne()
{
// Given
Map<Integer,Integer> map123 = new HashMap<>();
map123.put( 1, 1 );
map123.put( 2, 2 );
map123.put( 3, 3 );
Function2<Integer,Integer,Integer,RuntimeException> sumFun =
new Function2<Integer,Integer,Integer,RuntimeException>()
{
@Override
public Integer apply( Integer from1, Integer from2 )
{
return from1 + from2;
}
};
// When
Map<Integer,Integer> newMap123 = new HashMap<>();
newMap123.put( 1, 9 );
newMap123 = MapUtils.mergeMaps( map123, newMap123, sumFun );
// Then
assertThat( newMap123.size(), is( 3 ) );
assertThat( newMap123.get( 1 ), is( 10 ) );
assertThat( newMap123.get( 2 ), is( 2 ) );
assertThat( newMap123.get( 3 ), is( 3 ) );
}
@Test
public void loadPropertiesFileToMapShouldWork() throws IOException
{
// Given
Properties properties = new Properties();
properties.put( "one", "1" );
properties.put( "two", "2" );
File propertiesFile = temporaryFolder.newFile();
properties.store( new FileOutputStream( propertiesFile ), "no comment" );
// When
Map<String,String> map = MapUtils.loadPropertiesToMap( propertiesFile );
// Then
assertThat( map.get( "one" ), equalTo( "1" ) );
assertThat( map.get( "two" ), equalTo( "2" ) );
}
@Test
public void loadPropertiesStringToMapShouldWork() throws IOException
{
// Given
String propertiesString = "one=1\ntwo=2";
// When
Map<String,String> map = MapUtils.loadPropertiesStringToMap( propertiesString );
// Then
assertThat( map.get( "one" ), equalTo( "1" ) );
assertThat( map.get( "two" ), equalTo( "2" ) );
}
@Test
public void loadPropertiesInputStreamToMapShouldWork() throws IOException
{
// Given
String propertiesString = "one=1\ntwo=2";
InputStream propertiesInputStream =
new ByteArrayInputStream( propertiesString.getBytes( StandardCharsets.UTF_8 ) );
// When
Map<String,String> map = MapUtils.loadPropertiesInputStreamToMap( propertiesInputStream );
// Then
assertThat( map.get( "one" ), equalTo( "1" ) );
assertThat( map.get( "two" ), equalTo( "2" ) );
}
@Test
public void changeTypesShouldWorkWithToString() throws IOException
{
// Given
Map<Integer,Long> longMap = new HashMap<>();
longMap.put( 1, 10l );
longMap.put( 2, 20l );
Map<Integer,String> stringMapRight = new HashMap<>();
stringMapRight.put( 1, "10" );
stringMapRight.put( 2, "20" );
Map<Integer,String> stringMapWrong = new HashMap<>();
stringMapWrong.put( 1, "10" );
stringMapWrong.put( 2, "21" );
// When
Map<Integer,String> stringMapComputed = MapUtils.UNSAFE_changeTypes(
longMap,
TypeChangeFun.IDENTITY,
TypeChangeFun.TO_STRING
);
// Then
assertThat( stringMapRight, equalTo( stringMapComputed ) );
assertThat( stringMapRight, not( equalTo( stringMapWrong ) ) );
}
@Test
public void changeTypesShouldWorkWithMapping() throws IOException
{
// Given
Map<Integer,Long> longMap = new HashMap<>();
longMap.put( 1, 10l );
longMap.put( 2, 20l );
Map<Integer,String> mapping = new HashMap<>();
mapping.put( 1, "foo" );
mapping.put( 2, "bar" );
Map<String,String> expectedMap = new HashMap<>();
expectedMap.put( "foo", "10" );
expectedMap.put( "bar", "20" );
// When
Map<String,String> computedMap = MapUtils.UNSAFE_changeTypes(
longMap,
TypeChangeFun.mapped( mapping ),
TypeChangeFun.TO_STRING
);
// Then
assertThat( computedMap, equalTo( expectedMap ) );
}
@Test
public void shouldSwitchKeysAndValues() throws IOException
{
// Given
Map<Integer,Long> originalMap = new HashMap<>();
originalMap.put( 1, 10l );
originalMap.put( 2, 20l );
Map<Long,Integer> expectedMap = new HashMap<>();
expectedMap.put( 10l, 1 );
expectedMap.put( 20l, 2 );
// When
Map<Long,Integer> computedMap = MapUtils.UNSAFE_switchKeysAndValues( originalMap );
// Then
assertThat( computedMap, equalTo( expectedMap ) );
}
}