/*
 * 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.ignite.lang;

import java.util.concurrent.Callable;
import org.apache.ignite.internal.util.lang.GridMetadataAwareAdapter;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.apache.ignite.testframework.junits.common.GridCommonTest;
import org.junit.Test;

/**
 *
 */
@GridCommonTest(group = "Lang")
public class GridMetadataAwareAdapterSelfTest extends GridCommonAbstractTest {
    /** Creates test. */
    public GridMetadataAwareAdapterSelfTest() {
        super(/*start grid*/false);
    }

    /**
     * Junit.
     */
    @SuppressWarnings({"AssertWithSideEffects"})
    @Test
    public void test() {
        GridMetadataAwareAdapter ma = new GridMetadataAwareAdapter();

        int cnt = 0;

        int attr1 = cnt++;
        int attr2 = cnt++;
        int attr3 = cnt++;
        int attr4 = cnt++;
        int attr156 = cnt++;
        int k1 = cnt++;
        int k2 = cnt++;
        int k3 = cnt++;
        int a1 = cnt++;
        int a2 = cnt++;
        int a3 = cnt;

        // addMeta(name, val).
        assert ma.addMeta(attr1, "val1") == null;
        assert ma.addMeta(attr2, 1) == null;

        // hasMeta(name).
        assert ma.hasMeta(attr1);
        assert !ma.hasMeta(attr3);

        // hasMeta(name, val).
        assert ma.hasMeta(attr1, "val1");
        assert !ma.hasMeta(attr1, "some another val");

        // meta(name).
        assertEquals("val1", ma.meta(attr1));
        assertEquals(new Integer(1), ma.meta(attr2));

        // allMeta().
        Object[] allMeta = ma.allMeta();

        assert allMeta != null;

        assertEquals("val1", allMeta[attr1]);
        assertEquals(1, allMeta[attr2]);

        // addMetaIfAbsent(name, val).
        assert ma.addMetaIfAbsent(attr2, 2) == 1;
        assert ma.addMetaIfAbsent(attr3, 3) == 3;

        // addMetaIfAbsent(name, c).
        assert ma.addMetaIfAbsent(attr2, new Callable<Integer>() {
            @Override public Integer call() throws Exception {
                return 5;
            }
        }) == 1;

        assert ma.addMetaIfAbsent(attr4, new Callable<Integer>() {
            @Override public Integer call() throws Exception {
                return 5;
            }
        }) == 5;

        // removeMeta(name).
        assertEquals(new Integer(3), ma.removeMeta(attr3));
        assertEquals(new Integer(5), ma.removeMeta(attr4));

        assert ma.removeMeta(attr156) == null;

        // replaceMeta(name, newVal, curVal).
        assert !ma.replaceMeta(attr2, 5, 4);
        assert ma.replaceMeta(attr2, 1, 4);

        // copyMeta(from).
        GridMetadataAwareAdapter adapter = new GridMetadataAwareAdapter();
        adapter.addMeta(k1, "v1");
        adapter.addMeta(k2, 2);

        ma.copyMeta(adapter);

        allMeta = ma.allMeta();

        assertEquals("v1", ma.meta(k1));
        assertEquals(new Integer(2), ma.meta(k2));
        assertEquals("val1", allMeta[attr1]);
        assertEquals(4, allMeta[attr2]);

        assert !ma.hasMeta(k3);

        // copyMeta(from).
        Object[] objs = new Object[20];

        objs[a1] = 1;
        objs[a2] = 2;
        objs[19] = 19;

        ma.copyMeta(objs);

        assertEquals(new Integer(1), ma.meta(a1));
        assertEquals(new Integer(2), ma.meta(a2));
        assertEquals("v1", ma.meta(k1));
        assertEquals(new Integer(2), ma.meta(k2));
        assertEquals("val1", allMeta[attr1]);
        assertEquals(4, allMeta[attr2]);
        assertEquals(19, 19);

        assert !ma.hasMeta(a3);
    }
}
