/*
* Copyright (C) 2012 Facebook, 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.facebook.data.types;
import com.facebook.util.serialization.SerDe;
import com.facebook.util.serialization.SerDeUtils;
import com.google.common.collect.ImmutableMap;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.Iterator;
public class TestMapDatum {
private MapDatum primes1;
private MapDatum primes2;
private MapDatum fibonacci;
private MapDatum factorials;
@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception {
primes1 = new MapDatum(
new ImmutableMap.Builder<Datum, Datum>()
.put(new LongDatum(1), new LongDatum(2))
.put(new LongDatum(2), new LongDatum(3))
.put(new LongDatum(3), new LongDatum(5))
.put(new LongDatum(4), new LongDatum(7))
.build()
);
primes2 = new MapDatum(
new ImmutableMap.Builder<Datum, Datum>()
.put(new LongDatum(1), new LongDatum(2))
.put(new LongDatum(2), new LongDatum(3))
.put(new LongDatum(3), new LongDatum(5))
.put(new LongDatum(4), new LongDatum(7))
.build()
);
fibonacci = new MapDatum(
new ImmutableMap.Builder<Datum, Datum>()
.put(new LongDatum(0), new LongDatum(0))
.put(new LongDatum(1), new LongDatum(1))
.put(new LongDatum(2), new LongDatum(1))
.put(new LongDatum(3), new LongDatum(2))
.put(new LongDatum(4), new LongDatum(3))
.build()
);
factorials = new MapDatum(
new ImmutableMap.Builder<Datum, Datum>()
.put(new LongDatum(0), new LongDatum(1))
.put(new LongDatum(1), new LongDatum(1))
.put(new LongDatum(2), new LongDatum(2))
.put(new LongDatum(3), new LongDatum(6))
.put(new LongDatum(4), new LongDatum(24))
.build()
);
}
@Test(groups = "fast")
public void testCompare() throws Exception {
// check equality
Assert.assertEquals(primes1.compareTo(primes1), 0);
Assert.assertEquals(primes1.compareTo(primes2), 0);
Assert.assertEquals(primes1.compareTo(factorials), 1);
Assert.assertEquals(primes1.compareTo(factorials), 1);
Assert.assertEquals(factorials.compareTo(primes1), -1);
Assert.assertEquals(fibonacci.compareTo(factorials), -1);
Assert.assertEquals(factorials.compareTo(fibonacci), 1);
}
@Test(groups = "fast")
public void testEquality() throws Exception {
Assert.assertEquals(primes1, primes1);
Assert.assertEquals(primes1, primes2);
Assert.assertFalse(factorials.equals(primes2));
}
@Test(groups = "fast")
public void testAsString() throws Exception {
JSONObject primesJsonObject = new JSONObject(primes1.asString());
Assert.assertEquals(primesJsonObject.length(), 4);
Assert.assertEquals(primesJsonObject.getString("1"), "2");
Assert.assertEquals(primesJsonObject.getString("2"), "3");
Assert.assertEquals(primesJsonObject.getString("3"), "5");
Assert.assertEquals(primesJsonObject.getString("4"), "7");
}
@Test(groups = "fast")
public void testAsJsonString() throws Exception {
JSONObject jsonObject = DatumUtils.buildJSON(primes1);
JSONObject expected = new JSONObject("{\"3\":5,\"2\":3,\"1\":2,\"4\":7}");
Iterator<String> keys = expected.keys();
while (keys.hasNext()) {
String key = keys.next();
Assert.assertNotNull(jsonObject.remove(key), String.format("%s not present in result", key));
}
Assert.assertEquals(jsonObject.length(), 0, String.format("keys remaining: [%s]", jsonObject.keys()));
}
@Test(groups = "fast")
public void testAsBytes() throws Exception {
// asBytes() == asString, so if above task passes, and these are equal, we're good
String bytesAsString = new String(primes1.asBytes());
Assert.assertEquals(bytesAsString, primes1.asString());
}
@Test(groups = "fast")
public void testSerDe() throws Exception {
SerDe<Datum> serDe = new MapDatum.SerDeImpl();
Assert.assertEquals(
primes1,
SerDeUtils.deserializeFromBytes(
SerDeUtils.serializeToBytes(primes1, serDe),
serDe
)
);
}
}