package org.apache.helix;

/*
 * 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.
 */

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.testng.Assert;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;

public class TestZNRecord {

  @Test
  public void testEquals() {
    ZNRecord record1 = new ZNRecord("id");
    record1.setSimpleField("k1", "v1");
    record1.setMapField("m1", new HashMap<String, String>());
    record1.getMapField("m1").put("k1", "v1");
    record1.setListField("l1", new ArrayList<String>());
    record1.getListField("l1").add("v1");
    ZNRecord record2 = new ZNRecord("id");
    record2.setSimpleField("k1", "v1");
    record2.setMapField("m1", new HashMap<String, String>());
    record2.getMapField("m1").put("k1", "v1");
    record2.setListField("l1", new ArrayList<String>());
    record2.getListField("l1").add("v1");

    AssertJUnit.assertEquals(record1, record2);
    record2.setSimpleField("k2", "v1");
    AssertJUnit.assertNotSame(record1, record2);
  }

  @Test
  public void testMerge() {
    ZNRecord record = new ZNRecord("record1");

    // set simple field
    record.setSimpleField("simpleKey1", "simpleValue1");

    // set list field
    List<String> list1 = new ArrayList<String>();
    list1.add("list1Value1");
    list1.add("list1Value2");
    record.setListField("listKey1", list1);

    // set map field
    Map<String, String> map1 = new HashMap<String, String>();
    map1.put("map1Key1", "map1Value1");
    record.setMapField("mapKey1", map1);
    // System.out.println(record);

    ZNRecord updateRecord = new ZNRecord("updateRecord");

    // set simple field
    updateRecord.setSimpleField("simpleKey2", "simpleValue2");

    // set list field
    List<String> newList1 = new ArrayList<String>();
    newList1.add("list1Value1");
    newList1.add("list1Value2");
    newList1.add("list1NewValue1");
    newList1.add("list1NewValue2");
    updateRecord.setListField("listKey1", newList1);

    List<String> list2 = new ArrayList<String>();
    list2.add("list2Value1");
    list2.add("list2Value2");
    updateRecord.setListField("listKey2", list2);

    // set map field
    Map<String, String> newMap1 = new HashMap<String, String>();
    newMap1.put("map1NewKey1", "map1NewValue1");
    updateRecord.setMapField("mapKey1", newMap1);

    Map<String, String> map2 = new HashMap<String, String>();
    map2.put("map2Key1", "map2Value1");
    updateRecord.setMapField("mapKey2", map2);
    // System.out.println(updateRecord);

    record.merge(updateRecord);
    // System.out.println(record);

    ZNRecord expectRecord = new ZNRecord("record1");
    expectRecord.setSimpleField("simpleKey1", "simpleValue1");
    expectRecord.setSimpleField("simpleKey2", "simpleValue2");
    List<String> expectList1 = new ArrayList<String>();
    expectList1.add("list1Value1");
    expectList1.add("list1Value2");
    expectList1.add("list1Value1");
    expectList1.add("list1Value2");
    expectList1.add("list1NewValue1");
    expectList1.add("list1NewValue2");
    expectRecord.setListField("listKey1", expectList1);
    List<String> expectList2 = new ArrayList<String>();
    expectList2.add("list2Value1");
    expectList2.add("list2Value2");
    expectRecord.setListField("listKey2", expectList2);
    Map<String, String> expectMap1 = new HashMap<String, String>();
    expectMap1.put("map1Key1", "map1Value1");
    expectMap1.put("map1NewKey1", "map1NewValue1");
    expectRecord.setMapField("mapKey1", expectMap1);
    Map<String, String> expectMap2 = new HashMap<String, String>();
    expectMap2.put("map2Key1", "map2Value1");
    expectRecord.setMapField("mapKey2", expectMap2);
    Assert.assertEquals(record, expectRecord, "Should be equal.");
  }
}
