view src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/index/difference/IndexTest.java @ 329:2a0cb1f0ba4e

rename Error package
author kono
date Sat, 08 Jul 2017 21:05:55 +0900
parents 201cc75a9984
children
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.jungle.index.difference;

import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle;
import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
import jp.ac.u_ryukyu.ie.cr.jungle.core.Attributes;
import jp.ac.u_ryukyu.ie.cr.jungle.core.Children;
import jp.ac.u_ryukyu.ie.cr.jungle.store.index.Index;
import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex;
import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.DefaultNodePath;
import jp.ac.u_ryukyu.ie.cr.jungle.store.nodepath.NodePath;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.editor.jungleTreeEditor.JungleTreeEditor;
import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode;
import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree;
import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.Error;
import org.junit.Assert;
import org.junit.Test;

import java.nio.ByteBuffer;
import java.util.Iterator;

/**
 * Created by e115731 on 2016/12/31.
 */
public class IndexTest {
    private Index index;

    @Test
    public void Index() {
        Jungle jungle = new DefaultJungle(null, "hogehoge");
        jungle.createNewTree("tree");
        JungleTree tree = jungle.createNewDifferenceTree("Tree");
        JungleTreeEditor editor = tree.getJungleTreeEditor();
        NodePath path = new DefaultNodePath();
        for (int j = 0; j < 10; j++) { //木の構築
            Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path, 0);
            Assert.assertFalse(either.isA());
            editor = either.b();
            either = editor.putAttribute(path, "key", ByteBuffer.wrap(path.toString().getBytes()));
            Assert.assertFalse(either.isA());
            editor = either.b();
            path = path.add(0);
        }
        Either<Error, JungleTreeEditor> either = editor.success();
        Assert.assertFalse(either.isA());
        editor = either.b();

        index = tree.getIndex();
        TreeNode root = tree.getRootNode();
        checkIndex(root);//indexが張られているかを調べる
        Assert.assertTrue(index.isEmpty());


        //一回木を更新する
        editor = tree.getJungleTreeEditor();
        path = new DefaultNodePath();
        either = editor.addNewChildAt(path, 0);
        Assert.assertFalse(either.isA());
        editor = either.b();
        either = editor.putAttribute(path, "key", ByteBuffer.wrap(path.toString().getBytes()));
        Assert.assertFalse(either.isA());
        editor = either.b();
        either = editor.success();
        Assert.assertFalse(either.isA());

        //更新後にちゃんとIndexが貼れているかを調べる
        index = tree.getIndex();
        root = tree.getRootNode();
        checkIndex(root);
        Assert.assertTrue(index.isEmpty());

        Either<Error, JungleTree> oldTreeEither = tree.getOldTree(1);
        Assert.assertFalse(oldTreeEither.isA());
        JungleTree oldTree = oldTreeEither.b(); //過去のTreeのIndexが上書きされてないかを調べる
        ParentIndex oldTreeParentIndex = oldTree.getParentIndex();
        index = tree.getIndex();
        Assert.assertNotEquals(oldTreeParentIndex, index);
    }

    public void checkIndex(TreeNode currentNode) {
        Children children = currentNode.getChildren();
        for (TreeNode child : children) {
            checkIndex(child);
        }

        Attributes attribute = currentNode.getAttributes();
        Iterator<String> keys = attribute.getKeys();
        while (keys.hasNext()) {
            String key = keys.next();
            String value = attribute.getString(key);
            Iterator<TreeNode> nodeIterator = index.get(key, value);
            boolean existNode = false;
            while(nodeIterator.hasNext()) {
                TreeNode node = nodeIterator.next();
                if (node.equals(currentNode))
                    existNode = true;
            }
            Assert.assertTrue(existNode);
        }
        index = index.delete(currentNode);
    }
}