view src/test/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverse/TraverserTest.java @ 75:26dfa90016d1

error delete but 2 test program commentout and not action BulletinBoard Traverser is bad
author one
date Wed, 27 Aug 2014 05:52:46 +0900
parents 053c9b52a5b2
children 715a9fbf02fc
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverse;

import java.nio.ByteBuffer;

import org.junit.Assert;

import fj.data.List;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Direction;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
import junit.framework.TestCase;

public abstract class TraverserTest extends TestCase
{
	public abstract Traverser instance();
	
	public void testTraverse()
	{
		int maxHeight = 3;
		DefaultTreeNode root = createTree(0,0,maxHeight,new DefaultNodePath());
		
		//TraversableNodeWrapper<DefaultTreeNode> traversable = new TraversableNodeWrapper<DefaultTreeNode>(root);
		Traverser traverser = instance();
	
		// generate all pattern.
		List<DefaultNodePath> paths = generatePathPattern(new DefaultNodePath(),0,maxHeight);
		paths = paths.cons(new DefaultNodePath());
		
		for(DefaultNodePath path : paths){
			DefaultEvaluator evaluator = new DefaultEvaluator(path);
			Either<Error,Traversal<DefaultTreeNode>> ret = traverser.traverse(root,evaluator);
			if(ret.isA()){
				Assert.fail();
			}
			
			Traversal<DefaultTreeNode> traversal = ret.b();
			TreeNode target = traversal.destination();
			String expect = path.toString();
			ByteBuffer value = target.getAttributes().get(key);
			String actual = new String(value.array());
			Assert.assertEquals(expect,actual);
			
			List<DefaultNodePath> parts = path.inits();
			
			for(Direction<DefaultTreeNode> d : traversal){
				DefaultNodePath part = parts.head();
				parts = parts.tail();
				value = d.getTarget().getAttributes().get(key);
				String actualCurrentPathStr = new String(value.array());
				String expectCurrentPathStr = part.toString();
				Assert.assertEquals(expectCurrentPathStr,actualCurrentPathStr);
			}
		}
	}
	
	public List<DefaultNodePath> generatePathPattern(DefaultNodePath _cur,int _curHeight,int _maxHeight)
	{
		List<DefaultNodePath> paths = List.nil();
		for(int p = 0;p <= _curHeight;p ++){
			DefaultNodePath path = _cur.add(p);
			if(_curHeight != _maxHeight - 1){
				List<DefaultNodePath> newpaths = generatePathPattern(path,_curHeight+1,_maxHeight);
				paths = paths.append(newpaths);
			}
			paths = paths.cons(path);
		}
		
		return paths;
	}
	
	public static String key = "KEY";
	public static ByteBuffer value = ByteBuffer.wrap(key.getBytes());
	public static DefaultTreeNode factory = new DefaultTreeNode();
	
	public DefaultTreeNode createTree(int _curX,int _curY,int _maxHeight,NodePath _address)
	{
		DefaultTreeNode parent = factory.createNewNode();
		Either<Error,DefaultTreeNode> either = parent.getAttributes().put(key,ByteBuffer.wrap(_address.toString().getBytes()));
		if(either.isA()){
			Assert.fail();
		}
		parent = either.b();
		
		if(_curY == _maxHeight){
			return parent;
		}
		
		for(int i = 0;i < _curY + 1;i ++){
			DefaultTreeNode ch = createTree(i,_curY + 1,_maxHeight,_address.add(i));
			either = parent.getChildren().addNewChildAt(i,ch);
			if(either.isA()){
				Assert.fail();
			}
			
			parent = either.b();
		}
		
		return parent;
	}
}