view src/test/java/jp/ac/u_ryukyu/ie/cr/jungle/core/treeeditor/RedBlack/RedBlackTreeEditorAttributeTest.java @ 308:201cc75a9984

change Red Black Tree Edit Path Extends
author tatsuki
date Thu, 26 Jan 2017 15:23:25 +0900
parents 67ff36237722
children f8e75ef7ac5d
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.jungle.core.treeeditor.RedBlack;

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.query.traverser.InterfaceTraverser;
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.store.nodepath.RedBlackTreeNodePath;
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.Error.Error;
import org.junit.Assert;
import org.junit.Test;

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

public class RedBlackTreeEditorAttributeTest {
    @Test
    public void RedBlackTreeEditorAttribute(){
        String balanceKey = "balanceKey";
        String key = "key";
        ByteBuffer testPutValue = ByteBuffer.wrap("test".getBytes());
        Jungle jungle = new DefaultJungle(null, "hogehoge");
        JungleTree tree = jungle.createNewRedBlackTree("TreeName", "balanceKey");
        NodePath path = new DefaultNodePath();

        for (int count = 1; count <= 10; count++) { //とりあえず木構造の構築
            JungleTreeEditor editor = tree.getJungleTreeEditor();
            ByteBuffer value = ByteBuffer.wrap(("value" + count).getBytes());
            Either<Error, JungleTreeEditor> either = editor.addNewChildAndPutAttribute(path, 0, balanceKey, value);
            Assert.assertFalse(either.isA());
            editor = either.b();
            either = editor.success();
            Assert.assertFalse(either.isA());
        }

        JungleTreeEditor editor = tree.getJungleTreeEditor();
        path = path.add(1);
        NodePath rbtPath = new RedBlackTreeNodePath(balanceKey,ByteBuffer.wrap(("value6".getBytes())));
        Either<Error, JungleTreeEditor> either = editor.putAttribute(rbtPath, key, testPutValue);
        Assert.assertFalse(either.isA()); //AttributeのPutが成功したかどうか調べる
        editor = either.b();
        either = editor.success();
        Assert.assertFalse(either.isA());

        JungleTree oldTree = tree.getOldTree(tree.revision() - 1).b();
        TreeNode oldRoot = oldTree.getRootNode();
        TreeNode attributePutedTreeRoot = tree.getRootNode();
        Assert.assertNotEquals(attributePutedTreeRoot,oldRoot);//// とりあえずルートがちゃんと入れ替えられているかを調べる


        TreeNode editedNode = tree.getNodeOfPath(path).b();
        InterfaceTraverser traverser = tree.getTraverser(true);
        Iterator<TreeNode> nodeIterator = traverser.find((TreeNode n) -> {
            Attributes attributes = n.getAttributes();
            ByteBuffer v = attributes.get(key);
            return v != null && v.equals(testPutValue);
        },balanceKey,"value6");
        Assert.assertTrue(nodeIterator.hasNext());//PutAttributeの成功を確認


        InterfaceTraverser oldTreeTraverser = oldTree.getTraverser(true);
        nodeIterator = oldTreeTraverser.find((TreeNode n) -> {
            Attributes attributes = n.getAttributes();
            ByteBuffer v = attributes.get(key);
            return v != null && v.equals(testPutValue);
        },balanceKey,"value6");
        Assert.assertFalse(nodeIterator.hasNext());//過去の木に値が入っていないことを確認



        ByteBuffer oldRootValue = oldRoot.getAttributes().get(balanceKey);
        ByteBuffer newRootValue = attributePutedTreeRoot.getAttributes().get(balanceKey);//rootとかがちゃんと複製されているかを調べる
        Assert.assertEquals(oldRootValue,newRootValue);

        editor = tree.getJungleTreeEditor();
        either = editor.deleteAttribute(rbtPath,key);
        Assert.assertFalse(either.isA()); //Attributeのdeleteが成功したかどうか調べる
        editor = either.b();
        either = editor.success();
        Assert.assertFalse(either.isA());


        InterfaceTraverser valueDeletedTraverser = tree.getTraverser(true);
        nodeIterator = valueDeletedTraverser.find((TreeNode n) -> {
            Attributes attributes = n.getAttributes();
            ByteBuffer v = attributes.get(key);
            return v != null && v.equals(testPutValue);
        },balanceKey,"value6");
        Assert.assertFalse(nodeIterator.hasNext());//Attributeがちゃんと削除できたかを調べる
    }
}