org.jactr.modules.pm.motor.MotorModuleTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jactr.modules.pm.motor.MotorModuleTest.java

Source

/*
 * Created on Jul 7, 2006 Copyright (C) 2001-5, Anthony Harrison anh23@pitt.edu
 * (jactr.org) This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of the License,
 * or (at your option) any later version. This library is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
 * the GNU Lesser General Public License for more details. You should have
 * received a copy of the GNU Lesser General Public License along with this
 * library; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */
package org.jactr.modules.pm.motor;

import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

import junit.framework.TestCase;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.core.concurrent.ExecutorServices;
import org.jactr.core.model.IModel;
import org.jactr.core.module.procedural.event.ProceduralModuleEvent;
import org.jactr.core.module.procedural.event.ProceduralModuleListenerAdaptor;
import org.jactr.core.production.IProduction;
import org.jactr.core.runtime.ACTRRuntime;
import org.jactr.core.runtime.controller.debug.DebugController;
import org.jactr.entry.Main;
import org.jactr.io.CommonIO;

public class MotorModuleTest extends TestCase {
    /**
     * logger definition
     */
    static public final Log LOGGER = LogFactory.getLog(MotorModuleTest.class);

    static public final String ENVIRONMENT_FILE = "org/jactr/modules/pm/motor/environment.xml";

    ACTRRuntime _runtime;

    DebugController _controller;

    String[] _productionSequence = { "start", "start-punch", "movement-completed", "retrieve-next-movement",
            "start-peck", "movement-completed", "retrieve-next-movement", "start-punch", "movement-completed",
            "retrieve-next-movement", "start-peck-recoil", "movement-completed", "retrieve-next-movement",
            "retrieval-failed" };

    String[] _failedProductions = { "movement-failed" };

    int _productionFireCount = 0;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        _runtime = new Main().createRuntime(getClass().getClassLoader().getResource(ENVIRONMENT_FILE));
        _controller = (DebugController) _runtime.getController();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    protected JFrame openWindow() {
        final JFrame frame = new JFrame("TextInput");

        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    JTextArea textArea = new JTextArea();
                    frame.getContentPane().add(new JScrollPane(textArea));
                    frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
                    frame.setVisible(true);
                    textArea.grabFocus();
                }
            });
        } catch (Exception e) {

        }

        return frame;
    }

    protected void closeWindow(final JFrame frame) throws Exception {
        Thread.sleep(10000);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.setVisible(false);
            }
        });
    }

    public void test() throws Exception {
        assertEquals(1, _runtime.getModels().size());
        IModel model = _runtime.getModels().iterator().next();
        assertNotNull(model);

        // for(StringBuilder line : CommonIO.generateSource(model, "jactr"))
        // System.err.println(line);

        // will be null until we start
        assertNull(_runtime.getConnector().getAgent(model));

        /*
         * we need to run this model and track all the visual-locations that get
         * inserted into the visual-location buffer
         */

        model.getProceduralModule().addListener(new ProceduralModuleListenerAdaptor() {

            @Override
            public void conflictSetAssembled(ProceduralModuleEvent pme) {
                if (LOGGER.isDebugEnabled())
                    LOGGER.debug("conflict set : " + pme.getProductions());
            }

            @Override
            public void productionWillFire(ProceduralModuleEvent pme) {
                IProduction production = pme.getProduction();
                LOGGER.debug(production + " is about to run, checking");
                testProduction(production);

            }
        }, ExecutorServices.INLINE_EXECUTOR);

        JFrame window = openWindow();
        _controller.start().get();
        if (LOGGER.isDebugEnabled())
            LOGGER.debug("model run has started");

        _controller.complete().get();
        if (LOGGER.isDebugEnabled())
            LOGGER.debug("Model run has completed");
        assertEquals("Not all the productions have fired", _productionSequence.length, _productionFireCount);

        if (LOGGER.isDebugEnabled())
            for (StringBuilder sb : CommonIO.generateSource(model, "jactr"))
                LOGGER.debug(sb.toString());

        closeWindow(window);
    }

    protected void testProduction(IProduction production) {
        String pName = production.getSymbolicProduction().getName();
        // fail any in the _failedProductions
        for (String name : _failedProductions)
            if (name.equals(pName))
                fail("production " + name + " should not have fired. should have been "
                        + _productionSequence[_productionFireCount]);

        if (!_productionSequence[_productionFireCount].equals(pName))
            fail(pName + " was fired out of sequence, expecting " + _productionSequence[_productionFireCount]);
        _productionFireCount++;
    }
}