Code Search for Developers
 
 
  

RowFixture.java from MASE: Agile Software Engineering at Krugle


Show RowFixture.java syntax highlighted

// Modified or written by Object Mentor, Inc. for inclusion with FitNesse.
// Copyright (c) 2002 Cunningham & Cunningham, Inc.
// Released under the terms of the GNU General Public License version 2 or later.
// Copyright (c) 2002 Cunningham & Cunningham, Inc.
// Released under the terms of the GNU General Public License version 2 or later.

package fit;

import java.util.*;

abstract public class RowFixture extends ColumnFixture
{

	public Object results[];
	public List missing = new LinkedList();
	public List surplus = new LinkedList();

	public void doRows(Parse rows)
	{
		try
		{
			bind(rows.parts);
			results = query();
			match(list(rows.more), list(results), 0);
			Parse last = rows.last();
			last.more = buildRows(surplus.toArray());
			mark(last.more, "surplus");
			mark(missing.iterator(), "missing");
		}
		catch(Exception e)
		{
			exception(rows.leaf(), e);
		}
	}

	abstract public Object[] query() throws Exception;  // get rows to be compared

	abstract public Class getTargetClass();             // get expected type of row

	protected void match(List expected, List computed, int col)
	{
		if(col >= columnBindings.length)
		{
			check(expected, computed);
		}
		else if(columnBindings[col] == null)
		{
			match(expected, computed, col + 1);
		}
		else
		{
			Map eMap = eSort(expected, col);
			Map cMap = cSort(computed, col);
			Set keys = union(eMap.keySet(), cMap.keySet());
			for(Iterator i = keys.iterator(); i.hasNext();)
			{
				Object key = i.next();
				List eList = (List) eMap.get(key);
				List cList = (List) cMap.get(key);
				if(eList == null)
				{
					surplus.addAll(cList);
				}
				else if(cList == null)
				{
					missing.addAll(eList);
				}
				else if(eList.size() == 1 && cList.size() == 1)
				{
					check(eList, cList);
				}
				else
				{
					match(eList, cList, col + 1);
				}
			}
		}
	}

	protected List list(Parse rows)
	{
		List result = new LinkedList();
		while(rows != null)
		{
			result.add(rows);
			rows = rows.more;
		}
		return result;
	}

	protected List list(Object[] rows)
	{
		List result = new LinkedList();
		for(int i = 0; i < rows.length; i++)
		{
			result.add(rows[i]);
		}
		return result;
	}

	protected Map eSort(List list, int col)
	{
		TypeAdapter a = columnBindings[col].adapter;
		Map result = new HashMap(list.size());
		for(Iterator i = list.iterator(); i.hasNext();)
		{
			Parse row = (Parse) i.next();
			Parse cell = row.parts.at(col);
			try
			{
				Object key = a.parse(cell.text());
				bin(result, key, row);
			}
			catch(Exception e)
			{
				exception(cell, e);
				for(Parse rest = cell.more; rest != null; rest = rest.more)
				{
					ignore(rest);
				}
			}
		}
		return result;
	}

	protected Map cSort(List list, int col)
	{
		TypeAdapter a = columnBindings[col].adapter;
		Map result = new HashMap(list.size());
		for(Iterator i = list.iterator(); i.hasNext();)
		{
			Object row = i.next();
			try
			{
				a.target = row;
				Object key = a.get();
				bin(result, key, row);
			}
			catch(Exception e)
			{
				// surplus anything with bad keys, including null
				surplus.add(row);
			}
		}
		return result;
	}

	protected void bin(Map map, Object key, Object row)
	{
		if(key.getClass().isArray())
		{
			key = Arrays.asList((Object[]) key);
		}
		if(map.containsKey(key))
		{
			((List) map.get(key)).add(row);
		}
		else
		{
			List list = new LinkedList();
			list.add(row);
			map.put(key, list);
		}
	}

	protected Set union(Set a, Set b)
	{
		Set result = new HashSet();
		result.addAll(a);
		result.addAll(b);
		return result;
	}

	protected void check(List eList, List cList)
	{
		if(eList.size() == 0)
		{
			surplus.addAll(cList);
			return;
		}
		if(cList.size() == 0)
		{
			missing.addAll(eList);
			return;
		}
		Parse row = (Parse) eList.remove(0);
		Parse cell = row.parts;
		Object obj = cList.remove(0);
		for(int i = 0; i < columnBindings.length && cell != null; i++)
		{
			TypeAdapter a = columnBindings[i].adapter;
			if(a != null)
			{
				a.target = obj;
			}
			check(cell, a);
			cell = cell.more;
		}
		check(eList, cList);
	}

	protected void mark(Parse rows, String message)
	{
		String annotation = label(message);
		while(rows != null)
		{
			wrong(rows.parts);
			rows.parts.addToBody(annotation);
			rows = rows.more;
		}
	}

	protected void mark(Iterator rows, String message)
	{
		String annotation = label(message);
		while(rows.hasNext())
		{
			;
			Parse row = (Parse) rows.next();
			wrong(row.parts);
			row.parts.addToBody(annotation);
		}
	}

	protected Parse buildRows(Object[] rows)
	{
		Parse root = new Parse(null, null, null, null);
		Parse next = root;
		for(int i = 0; i < rows.length; i++)
		{
			next = next.more = new Parse("tr", null, buildCells(rows[i]), null);
		}
		return root.more;
	}

	protected Parse buildCells(Object row)
	{
		if(row == null)
		{
			Parse nil = new Parse("td", "null", null, null);
			nil.addToTag(" colspan=" + columnBindings.length);
			return nil;
		}
		Parse root = new Parse(null, null, null, null);
		Parse next = root;
		for(int i = 0; i < columnBindings.length; i++)
		{
			next = next.more = new Parse("td", "&nbsp;", null, null);
			TypeAdapter a = columnBindings[i].adapter;
			if(a == null)
			{
				ignore(next);
			}
			else
			{
				try
				{
					a.target = row;
					next.body = gray(escape(a.toString(a.get())));
				}
				catch(Exception e)
				{
					exception(next, e);
				}
			}
		}
		return root.more;
	}
}




See more files for this project here

MASE: Agile Software Engineering

The MASE project investigates methods to support the coordination and executable acceptance testing of software projects. Keywords: Agile methods, distributed teams, Extreme Programming. See http://ebe.cpsc.ucalgary.ca/ebe for more information.

Project homepage: http://sourceforge.net/projects/mase
Programming language(s): Java,XML
License: other

  exception/
    AmbiguousActionException.java
    AmbiguousNameFailureException.java
    BooleanMethodFitFailureException.java
    ClassIsNotFixtureException.java
    CouldNotLoadComponentFitFailureException.java
    CouldNotParseFitFailureException.java
    CycleException.java
    ExtraCellsFailureException.java
    FitFailureException.java
    FitFailureExceptionWithHelp.java
    FitMatcherException.java
    FitParseException.java
    FixtureException.java
    IgnoredException.java
    MissingCellsFailureException.java
    MissingFieldFitFailureException.java
    MissingMethodException.java
    MissingRowFailureException.java
    NestedTableExpected.java
    NoDefaultConstructorFixtureException.java
    NoSuchFieldFitFailureException.java
    NoSuchFixtureException.java
    NoSuchMethodFitFailureException.java
    RowWrongWidthException.java
    VoidMethodFitFailureException.java
  ActionFixture.java
  Binding.java
  ColumnFixture.java
  Comment.java
  Counts.java
  FileRunner.java
  FitMatcher.java
  Fixture.java
  FixtureClass.java
  FixtureListener.java
  FixtureLoader.java
  FixtureName.java
  GracefulNamer.java
  ImportFixture.java
  NullFixtureListener.java
  Parse.java
  PrimitiveFixture.java
  RowFixture.java
  ScientificDouble.java
  SummaryFixture.java
  TestRunner.java
  TimedActionFixture.java
  TypeAdapter.java
  WikiRunner.java