/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.eagle.log.entity.meta;

import java.util.HashMap;
import java.util.Map;

import org.junit.Assert;

import org.junit.Test;

public class TestMapSerDeser {

    @SuppressWarnings("rawtypes")
    @Test
    public void testStringToStringMapSerDeser() {
        MapSerDeser serDeser = new MapSerDeser();
        Map<String, String> sources = new HashMap<String, String>();
        sources.put("test1", "value1");
        sources.put("test2", null);
        sources.put("test3", "value3");

        byte[] bytes = serDeser.serialize(sources);
        Assert.assertEquals(4 + sources.size() * 16 + 27, bytes.length);
        Map targets = serDeser.deserialize(bytes);
        Assert.assertEquals(sources.size(), targets.size());

        Assert.assertEquals("value1", targets.get("test1"));
        Assert.assertNull(targets.get("test2"));
        Assert.assertEquals("value3", targets.get("test3"));
    }

    @SuppressWarnings("rawtypes")
    @Test
    public void testStringToIntegerMapSerDeser() {
        MapSerDeser serDeser = new MapSerDeser();
        Map<String, Integer> sources = new HashMap<String, Integer>();
        sources.put("test1", 1);
        sources.put("test2", null);
        sources.put("test3", 3);

        byte[] bytes = serDeser.serialize(sources);
        Assert.assertEquals(4 + sources.size() * 16 + 23, bytes.length);
        Map targets = serDeser.deserialize(bytes);
        Assert.assertEquals(sources.size(), targets.size());

        Assert.assertEquals(1, targets.get("test1"));
        Assert.assertNull(targets.get("test2"));
        Assert.assertEquals(3, targets.get("test3"));
    }

    @SuppressWarnings({
                       "rawtypes", "unchecked"
    })
    @Test
    public void testStringToMapMapSerDeser() {
        MapSerDeser serDeser = new MapSerDeser();
        Map<String, Map<String, String>> sources = new HashMap<String, Map<String, String>>();
        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("key11", "value11");
        map1.put("key12", null);
        map1.put("key13", "value13");
        sources.put("test1", map1);
        sources.put("test2", null);
        Map<String, String> map3 = new HashMap<String, String>();
        map3.put("key31", "value31");
        map3.put("key32", null);
        map3.put("key33", "value33");
        sources.put("test3", map3);

        byte[] bytes = serDeser.serialize(sources);
        Map targets = serDeser.deserialize(bytes);
        Assert.assertEquals(sources.size(), targets.size());

        map1 = (Map)targets.get("test1");
        Assert.assertNotNull(map1);
        Assert.assertEquals(3, map1.size());
        Assert.assertEquals("value11", map1.get("key11"));
        Assert.assertNull(map1.get("key12"));
        Assert.assertEquals("value13", map1.get("key13"));

        Assert.assertNull(targets.get("test2"));

        map3 = (Map)targets.get("test3");
        Assert.assertNotNull(map3);
        Assert.assertEquals(3, map3.size());
        Assert.assertEquals("value31", map3.get("key31"));
        Assert.assertNull(map3.get("key32"));
        Assert.assertEquals("value33", map3.get("key33"));
    }

}
