testitem.java

来自「SRI international 发布的OAA框架软件」· Java 代码 · 共 190 行

JAVA
190
字号
/*
#=========================================================================
# Copyright 2003 SRI International.  All rights reserved.
#
# The material contained in this file is confidential and proprietary to SRI
# International and may not be reproduced, published, or disclosed to others
# without authorization from SRI International.
#
# DISCLAIMER OF WARRANTIES
#
# SRI International MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
# SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SRI International SHALL NOT BE
# LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES
#=========================================================================
*/
package com.sri.oaa2.tools.oaatest;

import com.sri.oaa2.icl.*;
import antlr_oaa.*;


abstract class TestItem {
  interface EventAdder {
    void addRecv(IclTerm evt);

    void addSend(IclTerm evt);
  }

  protected TestItem() {
  }

  /** Used to generate unique GoalId in parseWithSynonmys. */
  static int gidUnique = 1;

  /** Parse string describing an ICL term allowing for the following synonmys:
   *
   * oaa_Solve(Goal,Params) 
   * --> ev_solve(GoalId, Goal, Params)
   * 
   * oaa_AddData(Data,Params)
   * oaa_RemoveData(Data,Params) 
   * oaa_ReplaceData(Data,Params)
   * oaa_LoadData(Data,Params)
   * oaa_SaveData(Data,Params) 
   * --> ev_update_data(GoalId,Mode,Data,Params)  
   *       Mode = add,remove,replace,load,save
   * 
   * oaa_AddTrigger(Type,Condition,Action,Params)
   * oaa_RemoveTrigger(Type,Condition,Action,Params)
   * --> ev_update_trigger(GoalId,Mode,T,C,A,P)  
   *       Mode = add,remove
   * 
   * @param generateGoal true - generate unique GoalIds as appropriate.  false - use '_' for GoalId
   * @return new IclTerm or null if can't parse
   */
  static IclTerm parseWithSynonyms(String icl,boolean generateGoal) {
    // Eat whitespace.
    int start = 0;
    int len = icl.length();
    while (start < len && Character.isWhitespace(icl.charAt(start))) {
      start++;
    }
    // start now points to first non ws char or end of string
    
    // Find first functor, if it exists.
    String functor = null;
    // If functor is non-null, so will args be.
    IclGroup args = null;
    for (int i = start; i < len; i++) {
      char c = icl.charAt(i);
      if (c == '(') {
        if (i > start) {
          try {
            String f = icl.substring(start,i);
            IclGroup a = (IclGroup)IclUtils.fromString(icl.substring(i,len));   
            if (a.getStarter() == '(' && a.getEnder() == ')') {
              // success, found functor and args.
              functor = f;
              args = a;
            }
          }
          catch (ANTLRException e) {
            // Rest of string is not an IclTerm
          }
          catch (ClassCastException e) {
            // Rest of string is not an IclGroup
          }
        }
        else {
          // failed, first non-ws char is (
        }
        // success or failure, we're done.
        break;
      }
      else if (!(c == '_' || Character.isLetterOrDigit(c))) {
        // failed, not a functor
        break;
      }
    }

    // If we found a functor and arguments, check for synonmys.
    if (functor != null) {
      if (functor.equals("oaa_Solve") && args.getNumChildren() == 2) {
        IclStruct ret = new IclStruct("ev_solve");
        ret.add(generateGoalId(generateGoal));
        ret.addAll(args);
        return ret;
      }
      else if (functor.equals("oaa_AddData") && args.getNumChildren() == 2) {
        return pwsDataHelper("add",args,generateGoal);
      }
      else if (functor.equals("oaa_RemoveData") && args.getNumChildren() == 2) {
        return pwsDataHelper("remove",args,generateGoal);
      }
      else if (functor.equals("oaa_ReplaceData") && args.getNumChildren() == 2) {
        return pwsDataHelper("replace",args,generateGoal);
      }
      else if (functor.equals("oaa_LoadData") && args.getNumChildren() == 2) {
        return pwsDataHelper("load",args,generateGoal);
      }
      else if (functor.equals("oaa_SaveData") && args.getNumChildren() == 2) {
        return pwsDataHelper("save",args,generateGoal);
      }
      else if (functor.equals("oaa_AddTrigger") && args.getNumChildren() == 4) {
        return pwsTriggerHelper("add",args,generateGoal);
      }
      else if (functor.equals("oaa_RemoveTrigger") && args.getNumChildren() == 4) {
        return pwsTriggerHelper("remove",args,generateGoal);
      }
      
      // return iclterm from functor and children, 
      IclStruct ret = new IclStruct(functor);
      ret.addAll(args);
      return ret;        
    }

    // No functor/children, parse normally.
    try {
      return IclUtils.fromString(icl.toString());
    }
    catch (ANTLRException e) {
      return null;
    }    
  }

  /** Helper for parseWithSynonyms() for ev_update_data. */
  static private IclTerm pwsDataHelper(String mode,IclGroup dataAndParams,boolean generateGoal) {
    IclStruct ret = new IclStruct("ev_update_data");
    ret.add(generateGoalId(generateGoal));
    ret.add(new IclStr(mode));
    ret.addAll(dataAndParams);
    return ret;
  }

  /** Helper for parseWithSynonyms() for ev_update_trigger. */
  static private IclTerm pwsTriggerHelper(String mode,IclGroup tcap,boolean generateGoal) {
    IclStruct ret = new IclStruct("ev_update_trigger");
    ret.add(generateGoalId(generateGoal));
    ret.add(new IclStr(mode));
    ret.addAll(tcap);
    return ret;
  }

  /** GoalId appropriate for ev_solve(), ev_update_data(), etc */
  static private IclTerm generateGoalId(boolean generateGoal) {
    if (generateGoal) {
      return new IclStr("g_" + (gidUnique++));
    }
    else {
      return new IclVar("_");
    }
  }

  /** Similar to JUnit, normal return means success.  assert() or fail() if a
   * problem.
   */
  abstract void runTest();

  /** Some TestItems need to have triggers set on the facilitator before
   * runTest() will work correctly.  Subclass should specify which events
   * it is interested in. */ 
  abstract void addTriggerEvents(EventAdder e);  
}



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?