From 3cdc6196e34122a476a69fe1c1ffec8533dd6ba7 Mon Sep 17 00:00:00 2001 From: John Koenig Date: Mon, 6 Jun 2016 11:25:01 -0500 Subject: [PATCH 1/3] Support for External Effects & Parameterized Domains (#6) * Added new :external-effects token * Parameterized domains + external effects + strings * Using monitor to catch abnormal parser failures * Update to string template unit test --- include/epddl_types.hrl | 11 ++ src/epddl.erl | 31 ++++- src/epddl_parser.yrl | 139 +++++++++++++-------- src/epddl_tokenizer.xrl | 3 + test/{epddl_domain_test.erl => domain.erl} | 13 +- test/external_effects.erl | 70 +++++++++++ test/probabilistic_test.erl | 2 +- 7 files changed, 211 insertions(+), 58 deletions(-) rename test/{epddl_domain_test.erl => domain.erl} (82%) create mode 100644 test/external_effects.erl diff --git a/include/epddl_types.hrl b/include/epddl_types.hrl index 6daa047..24303e3 100644 --- a/include/epddl_types.hrl +++ b/include/epddl_types.hrl @@ -16,10 +16,20 @@ | {bool_op(), bool_expr()} | {bool_multi_op(), list(bool_expr())}. +-type stringExpr() :: binary() | {binary(), [#var{}]}. +-record(external_effect, + { + method :: binary(), %%<<"post">> | <<"get">> | <<"put">> | <<"patch">> | <<"delete">> + url :: stringExpr(), + headers :: stringExpr(), + body :: stringExpr() + }). + -record(effect, { delta = true :: true | #predicate{} + | #external_effect{} | {bool_op(), #predicate{}} | {bool_multi_op(), list(#effect{})} | list({float(), #effect{}}), @@ -41,6 +51,7 @@ -record(domain, {id :: undefined | binary(), + parameters = [] :: list(binary()), requirements = [] :: list(binary()), types = [] :: list(binary()), predicates = [] :: list(#predicate{}), diff --git a/src/epddl.erl b/src/epddl.erl index d61d905..7df54b9 100644 --- a/src/epddl.erl +++ b/src/epddl.erl @@ -17,8 +17,35 @@ tokens(Binary) when is_binary(Binary) -> parse(String) -> {ok, Tokens, _} = epddl_tokenizer:string(String), - {ok, AST} = epddl_parser:parse(Tokens), - AST. + Self = self(), + + %% Parsing requires use of global state (ETS). + %% As such, we parse within a separate thread to + %% ensure this global state is cleaned up properly. + ParseFN = + fun()-> + Res = + try + epddl_parser:parse(Tokens) + catch + _:Reason -> + {error, Reason} + end, + Self ! {'$epddl_parse', Res} + end, + Pid = spawn(ParseFN), + Ref = erlang:monitor(process, Pid), + + receive + {'$epddl_parse', {ok, Res}} -> + Res; + + {'$epddl_parse', {error, Error}} -> + error(Error); + + {_, Ref, process, _, Info} -> + error({parsing_failed, Info}) + end. parse_file(Filename) -> {ok, FileContents} = read_lines(Filename), diff --git a/src/epddl_parser.yrl b/src/epddl_parser.yrl index 1cc7c94..ab3e29c 100644 --- a/src/epddl_parser.yrl +++ b/src/epddl_parser.yrl @@ -1,10 +1,10 @@ Nonterminals definition domainExpr domainPropList domainProp - typesExpr predicatesExpr predicate predicateDef predicateDefList actionDefList actionDef actionPropList actionProp effectExpr effectExprList + stringExpr probabilisticEffect probabilisticEffectList timeSpecifier durationConstraints durationConstraint durationConstraintOp varDef varDefList @@ -27,7 +27,8 @@ Terminals '(' ')' '-' '=' '<' '>' probabilistic duration number - name. + name + string. Rootsymbol definition. @@ -39,23 +40,25 @@ domainExpr -> domainExpr -> '(' domain id ')' domainPropList : to_domain('$3', '$5'). -domainProp -> - typesExpr : {types, '$1'}. -domainProp -> - predicatesExpr : {predicates, '$1'}. -domainProp -> - actionDefList : {actions, '$1'}. - domainPropList -> domainProp : ['$1']. domainPropList -> domainProp domainPropList : ['$1'|'$2']. -typesExpr -> - '(' types idList ')' : require(typing), '$3'. - -predicatesExpr -> - '(' predicates predicateDefList ')' : '$3'. +domainProp -> + '(' types idList ')' : + require(typing), + {types, '$3'}. +domainProp -> + '(' predicates predicateDefList ')' : + {predicates, '$3'}. +domainProp -> + '(' parameters idList ')' : + require('parameterized-domains'), + {parameters, '$3'}. +domainProp -> + actionDefList : + {actions, '$1'}. predicateDef -> '(' id varDefList ')' : #predicate{id='$2', vars='$3'}. @@ -136,35 +139,31 @@ effectExpr -> '(' boolMultiOp effectExprList ')' : #effect{delta={'$2', '$3'}}. effectExpr -> '(' probabilistic probabilisticEffectList ')' : - require('probabilistic-effects'), - ProbEffects = '$3', - Sum = fun({Val, _}, Acc) -> Val + Acc end, - Total = lists:foldl(Sum, 0, ProbEffects), - NewProbEffects = - if - Total > 1 -> - %% Constraint violation - error(bad_probabilistic); - - Total < 1 -> - Diff = 1.0 - Total, - RoundedDiff = round(Diff * math:pow(10, 2)) / math:pow(10, 2), - [{RoundedDiff, #effect{delta=true}}|ProbEffects]; - - true -> - ProbEffects - end, - #effect{delta=NewProbEffects}. + to_probabilistic_effect('$3'). effectExpr -> '(' 'at' timeSpecifier effectExpr ')' : Effect = '$4', Effect#effect{time = '$3'}. +effectExpr -> + '(' name stringExpr stringExpr stringExpr ')' : + to_external_effect(extract('$2'), '$3', '$4', '$5'). effectExprList -> effectExpr : ['$1']. effectExprList -> effectExpr effectExprList : ['$1'|'$2']. +stringExpr -> + string : extract('$1'). +stringExpr -> + '(' ')' : <<"">>. +stringExpr -> + '(' string ')' : + extract('$2'). +stringExpr -> + '(' string idList ')' : + {extract('$2'), '$3'}. + probabilisticEffect -> number effectExpr : {extract('$1'), '$2'}. @@ -265,28 +264,60 @@ require(Req) -> ensure_table(?REQUIREMENTS_TID), ets:insert(?REQUIREMENTS_TID, {atom_to_binary(Req, utf8), true}). -cleanup() -> - try - true = ets:delete(?REQUIREMENTS_TID) - catch - _:_ -> - true - end. - to_domain(ID, []) -> - Domain = #domain{id=ID}, - cleanup(), - Domain; + #domain{id=ID}; to_domain(ID, PropList) -> DomainMap = maps:from_list(PropList), Requirements = [Req || {Req, true} <- tab2list(?REQUIREMENTS_TID)], - Domain = - #domain{ - id = ID, - requirements = Requirements, - types = maps:get(types, DomainMap, []), - predicates = maps:get(predicates, DomainMap, []), - actions = maps:get(actions, DomainMap, []) - }, - cleanup(), - Domain. + #domain{ + id = ID, + requirements = Requirements, + parameters = maps:get(parameters, DomainMap, []), + types = maps:get(types, DomainMap, []), + predicates = maps:get(predicates, DomainMap, []), + actions = maps:get(actions, DomainMap, []) + }. + +to_probabilistic_effect(ProbEffects) -> + require('probabilistic-effects'), + Sum = fun({Val, _}, Acc) -> Val + Acc end, + Total = lists:foldl(Sum, 0, ProbEffects), + NewProbEffects = + if + Total > 1 -> + %% Constraint violation + error(bad_probabilistic); + + Total < 1 -> + Diff = 1.0 - Total, + RoundedDiff = round(Diff * math:pow(10, 2)) / math:pow(10, 2), + [{RoundedDiff, #effect{delta=true}}|ProbEffects]; + + true -> + ProbEffects + end, + #effect{delta=NewProbEffects}. + +to_external_effect(Method, URL, Headers, Body) -> + require('external-effects'), + ValidMethods = + [<<"post">>, + <<"put">>, + <<"patch">>, + <<"get">>, + <<"delete">> + ], + + case lists:member(Method, ValidMethods) of + true -> + Delta = #external_effect{ + method=Method, + url = URL, + headers=Headers, + body=Body + }, + #effect{delta=Delta}; + + false -> + erlang:error({invalid_method, Method}) + end. diff --git a/src/epddl_tokenizer.xrl b/src/epddl_tokenizer.xrl index cf0f27b..02bf5c3 100644 --- a/src/epddl_tokenizer.xrl +++ b/src/epddl_tokenizer.xrl @@ -8,6 +8,7 @@ INT = {DIGIT}+ NUMBER = {INT}(\.{INT}+)? NAME = {LETTER}{CHAR}* IDENTIFIER = \?{NAME} +STRING = \"(\\.|[^"])*\" DEFINE = define DOMAIN = domain @@ -65,6 +66,8 @@ Rules. {NUMBER} : {token, {number, TokenLine, list_to_float(TokenChars)}}. {NAME} : {token, {name, TokenLine, list_to_binary(TokenChars)}}. {IDENTIFIER} : [$?|ID] = TokenChars, {token, {name, TokenLine, list_to_binary(ID)}}. +{STRING} : Guts = string:strip(TokenChars, both, $\"), + {token, {string, TokenLine, list_to_binary(Guts)}}. {WHITESPACE}+ : skip_token. diff --git a/test/epddl_domain_test.erl b/test/domain.erl similarity index 82% rename from test/epddl_domain_test.erl rename to test/domain.erl index f141926..1b407e7 100644 --- a/test/epddl_domain_test.erl +++ b/test/domain.erl @@ -1,4 +1,4 @@ --module(epddl_domain_test). +-module(domain). -include("../include/epddl_types.hrl"). @@ -59,3 +59,14 @@ simple_action_precondition_test() -> {'and', [Loc, IsCar]} = Bar#action.precondition, {predicate, <<"loc">>, [<<"x">>, <<"y">>]} = Loc, {predicate, <<"isCar">>, [<<"y">>]} = IsCar. + +parameters_test() -> + DomainStr = "(define (domain foo) (:parameters ?host ?port) (:action bar :precondition (and (loc ?x ?y) (isCar ?y))))", + Domain = epddl:parse(DomainStr), + + ?assertMatch([<<"parameterized-domains">>], Domain#domain.requirements), + + Params = Domain#domain.parameters, + ?assert(is_list(Params)), + ?assert(length(Params) == 2), + ?assertMatch([], [<<"host">>, <<"port">>] -- Params). diff --git a/test/external_effects.erl b/test/external_effects.erl new file mode 100644 index 0000000..01423e6 --- /dev/null +++ b/test/external_effects.erl @@ -0,0 +1,70 @@ +-module(external_effects). + +-include("../include/epddl_types.hrl"). + +-include_lib("eunit/include/eunit.hrl"). + +string_test() -> + DomainStr = "(define (domain foo) (:action bar :effect (post \"\" \"\" \"\" )))", + Domain = epddl:parse(DomainStr), + + [Bar] = Domain#domain.actions, + Effect = Bar#action.effect, + ?assert(is_record(Effect, effect)), + + Delta = Effect#effect.delta, + ?assert(is_record(Delta, external_effect)), + ?assertMatch(<<"post">>, Delta#external_effect.method), + ?assertMatch(<<"">>, Delta#external_effect.url), + ?assertMatch(<<"">>, Delta#external_effect.headers), + ?assertMatch(<<"">>, Delta#external_effect.body). + +string_template_test() -> + DomainStr = "(define (domain foo) (:action bar :effect (post (\"http://www.google.com/{}/{}/{}\" ?x ?y ?z) ( \"\" ?a ?b) (\"\"))))", + Domain = epddl:parse(DomainStr), + + [Bar] = Domain#domain.actions, + Effect = Bar#action.effect, + ?assert(is_record(Effect, effect)), + + Delta = Effect#effect.delta, + ?assert(is_record(Delta, external_effect)), + ?assertMatch(<<"post">>, Delta#external_effect.method), + ?assertMatch({<<"http://www.google.com/{}/{}/{}">>, [<<"x">>, <<"y">>, <<"z">>]}, Delta#external_effect.url), + ?assertMatch({<<"">>, [<<"a">>, <<"b">>]}, Delta#external_effect.headers), + ?assertMatch(<<"">>, Delta#external_effect.body). + +valid_method_test() -> + Methods = [<<"post">>, <<"put">>, <<"get">>, <<"patch">>, <<"delete">>], + + [begin + DomainStr = lists:flatten(io_lib:format("(define (domain foo) (:action bar :effect (~s () () ())))", [Method])), + Domain = epddl:parse(DomainStr), + + ?assertMatch([<<"external-effects">>], Domain#domain.requirements), + + [Bar] = Domain#domain.actions, + + Effect = Bar#action.effect, + ?assertNotMatch(undefined, Effect), + ?assert(is_record(Effect, effect)), + + Delta = Effect#effect.delta, + ?assert(is_record(Delta, external_effect)), + ?assertMatch(Method, Delta#external_effect.method), + ?assertMatch(<<"">>, Delta#external_effect.url), + ?assertMatch(<<"">>, Delta#external_effect.headers), + ?assertMatch(<<"">>, Delta#external_effect.body) + end || Method <- Methods]. + +invalid_method_test() -> + DomainStr = "(define (domain foo) (:action bar :effect (badmethod () () ())))", + Good= + try + _Domain = epddl:parse(DomainStr), + false %% <--- Should not be reached + catch + _:_ -> + true + end, + ?assert(Good). diff --git a/test/probabilistic_test.erl b/test/probabilistic_test.erl index 7049689..f821458 100644 --- a/test/probabilistic_test.erl +++ b/test/probabilistic_test.erl @@ -7,7 +7,7 @@ prob_effect_requires_probabilistic_effects_test() -> DomainStr = "(define (domain foo) (:action bar :effect (probabilistic 1.0 ())))", Domain = epddl:parse(DomainStr), - [<<"probabilistic-effects">>] = Domain#domain.requirements. + ?assertMatch([<<"probabilistic-effects">>], Domain#domain.requirements). prob_effect_sum_less_than_1_test() -> DomainStr = "(define (domain foo) (:action bar :effect (probabilistic 0.40 () 0.37 ())))", From 4f350c015c0e3ea3b033ad2262ac317cbfe6c51f Mon Sep 17 00:00:00 2001 From: John Koenig Date: Thu, 16 Jun 2016 11:28:47 -0500 Subject: [PATCH 2/3] eppdl:parse now returning error tuples instead of throwing errors. --- src/epddl.erl | 9 +++------ test/domain.erl | 12 ++++++------ test/durative_actions.erl | 16 ++++++++-------- test/epddl_requirements_typing_test.erl | 6 +++--- test/external_effects.erl | 16 ++++------------ test/probabilistic_test.erl | 4 ++-- 6 files changed, 26 insertions(+), 37 deletions(-) diff --git a/src/epddl.erl b/src/epddl.erl index 7df54b9..c8fb8f1 100644 --- a/src/epddl.erl +++ b/src/epddl.erl @@ -37,14 +37,11 @@ parse(String) -> Ref = erlang:monitor(process, Pid), receive - {'$epddl_parse', {ok, Res}} -> + {'$epddl_parse', Res} -> Res; - - {'$epddl_parse', {error, Error}} -> - error(Error); - + {_, Ref, process, _, Info} -> - error({parsing_failed, Info}) + {error, {parsing_failed, Info}} end. parse_file(Filename) -> diff --git a/test/domain.erl b/test/domain.erl index 1b407e7..e350f19 100644 --- a/test/domain.erl +++ b/test/domain.erl @@ -6,14 +6,14 @@ empty_domain_test() -> SimpleDomain = "(define (domain foo))", - DomainDef = epddl:parse(SimpleDomain), + {ok, DomainDef} = epddl:parse(SimpleDomain), ?assert(is_record(DomainDef, domain)), ?assert(DomainDef#domain.id /= undefined), ?assert(DomainDef#domain.id == <<"foo">>). simple_action_test() -> DomainStr = "(define (domain foo) (:action bar :effect ()))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), ?assert(length(Domain#domain.actions) == 1), [Bar] = Domain#domain.actions, @@ -26,7 +26,7 @@ simple_action_test() -> action_effect_test() -> DomainStr = "(define (domain foo) (:action bar :effect (and (loc ?v) (loc ?b) (not (loc ?c ?d)))))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, ?assert(Bar#action.effect /= undefined), @@ -42,7 +42,7 @@ action_effect_test() -> action_parameters_test() -> DomainStr = "(define (domain foo) (:action bar :parameters (?a ?b ?c)))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, @@ -53,7 +53,7 @@ action_parameters_test() -> simple_action_precondition_test() -> DomainStr = "(define (domain foo) (:action bar :precondition (and (loc ?x ?y) (isCar ?y))))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, {'and', [Loc, IsCar]} = Bar#action.precondition, @@ -62,7 +62,7 @@ simple_action_precondition_test() -> parameters_test() -> DomainStr = "(define (domain foo) (:parameters ?host ?port) (:action bar :precondition (and (loc ?x ?y) (isCar ?y))))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), ?assertMatch([<<"parameterized-domains">>], Domain#domain.requirements), diff --git a/test/durative_actions.erl b/test/durative_actions.erl index 1fad238..fc12a8a 100644 --- a/test/durative_actions.erl +++ b/test/durative_actions.erl @@ -6,7 +6,7 @@ durative_action_equal_test() -> DomainStr ="(define (domain foo) (:action bar :duration (= 10) :effect ()))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [<<"durative-actions">>] = Domain#domain.requirements, @@ -15,7 +15,7 @@ durative_action_equal_test() -> durative_action_literal_test() -> DomainStr ="(define (domain foo) (:action bar :duration 101 :effect ()))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [<<"durative-actions">>] = Domain#domain.requirements, [Bar] = Domain#domain.actions, @@ -23,7 +23,7 @@ durative_action_literal_test() -> durative_action_gte_test() -> DomainStr ="(define (domain foo) (:action bar :duration (>= 101.103) :effect ()))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), ?assert(lists:member(<<"duration-inequalities">>, Domain#domain.requirements)), @@ -32,7 +32,7 @@ durative_action_gte_test() -> durative_action_lte_test() -> DomainStr ="(define (domain foo) (:action bar :duration (<= 300) :effect ()))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), ?assert(lists:member(<<"duration-inequalities">>, Domain#domain.requirements)), @@ -41,7 +41,7 @@ durative_action_lte_test() -> multi_constraint_durative_action_test() -> DomainStr ="(define (domain foo) (:action bar :duration (and (<= 300) (>= 250)) :effect ()))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), ?assert(lists:member(<<"duration-inequalities">>, Domain#domain.requirements)), @@ -60,7 +60,7 @@ duration_var_in_constraint_results_in_error_test() -> start_effect_test() -> DomainStr = "(define (domain foo) (:action bar :duration (<= 300) :effect (at start ())))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, Effect = Bar#action.effect, @@ -68,7 +68,7 @@ start_effect_test() -> stop_effect_test() -> DomainStr = "(define (domain foo) (:action bar :duration (<= 300) :effect (at end ())))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, Effect = Bar#action.effect, @@ -76,7 +76,7 @@ stop_effect_test() -> nested_durative_effect_test() -> DomainStr = "(define (domain foo) (:action bar :duration (<= 300) :effect (and (at end ()) (at start ()))))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, Effect = Bar#action.effect, diff --git a/test/epddl_requirements_typing_test.erl b/test/epddl_requirements_typing_test.erl index b033159..059a369 100644 --- a/test/epddl_requirements_typing_test.erl +++ b/test/epddl_requirements_typing_test.erl @@ -6,15 +6,15 @@ types_forces_typing_requirement_test() -> DomainStr = "(define (domain foo) (:types bar))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), Domain#domain.requirements == ["typing"]. typed_vars_forces_typing_requirement_test() -> DomainStr = "(define (domain foo) (:predicates (bar ?v - vehicle)))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), Domain#domain.requirements == ["typing"]. types_and_typed_vars_forces_typing_requirement_test() -> DomainStr = "(define (domain foo) (:types vehicle) (:predicates (bar ?v - vehicle)))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), Domain#domain.requirements == ["typing"]. diff --git a/test/external_effects.erl b/test/external_effects.erl index 01423e6..6b1fe26 100644 --- a/test/external_effects.erl +++ b/test/external_effects.erl @@ -6,7 +6,7 @@ string_test() -> DomainStr = "(define (domain foo) (:action bar :effect (post \"\" \"\" \"\" )))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, Effect = Bar#action.effect, @@ -21,7 +21,7 @@ string_test() -> string_template_test() -> DomainStr = "(define (domain foo) (:action bar :effect (post (\"http://www.google.com/{}/{}/{}\" ?x ?y ?z) ( \"\" ?a ?b) (\"\"))))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, Effect = Bar#action.effect, @@ -39,7 +39,7 @@ valid_method_test() -> [begin DomainStr = lists:flatten(io_lib:format("(define (domain foo) (:action bar :effect (~s () () ())))", [Method])), - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), ?assertMatch([<<"external-effects">>], Domain#domain.requirements), @@ -59,12 +59,4 @@ valid_method_test() -> invalid_method_test() -> DomainStr = "(define (domain foo) (:action bar :effect (badmethod () () ())))", - Good= - try - _Domain = epddl:parse(DomainStr), - false %% <--- Should not be reached - catch - _:_ -> - true - end, - ?assert(Good). + ?assertMatch({error, _}, epddl:parse(DomainStr)). diff --git a/test/probabilistic_test.erl b/test/probabilistic_test.erl index f821458..f4ad08a 100644 --- a/test/probabilistic_test.erl +++ b/test/probabilistic_test.erl @@ -6,12 +6,12 @@ prob_effect_requires_probabilistic_effects_test() -> DomainStr = "(define (domain foo) (:action bar :effect (probabilistic 1.0 ())))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), ?assertMatch([<<"probabilistic-effects">>], Domain#domain.requirements). prob_effect_sum_less_than_1_test() -> DomainStr = "(define (domain foo) (:action bar :effect (probabilistic 0.40 () 0.37 ())))", - Domain = epddl:parse(DomainStr), + {ok, Domain} = epddl:parse(DomainStr), [Bar] = Domain#domain.actions, #effect{delta=ProbEffect} = Bar#action.effect, From 61ffd788da21d620aa5ea0e1552d1cbee898511d Mon Sep 17 00:00:00 2001 From: John Koenig Date: Thu, 16 Jun 2016 12:13:53 -0500 Subject: [PATCH 3/3] More unit test cleanup --- test/general.erl | 12 ++++++++++++ ...requirements_typing_test.erl => requirements.erl} | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 test/general.erl rename test/{epddl_requirements_typing_test.erl => requirements.erl} (94%) diff --git a/test/general.erl b/test/general.erl new file mode 100644 index 0000000..90ab561 --- /dev/null +++ b/test/general.erl @@ -0,0 +1,12 @@ +-module(general). + +-include("../include/epddl_types.hrl"). + +-include_lib("eunit/include/eunit.hrl"). + +%% Asserts that parsing does not pollute local context +parse_cleanup_test() -> + Before = ets:all(), + DomainStr = "(define (domain foo))", + epddl:parse(DomainStr), + ?assertMatch(Before, ets:all()). diff --git a/test/epddl_requirements_typing_test.erl b/test/requirements.erl similarity index 94% rename from test/epddl_requirements_typing_test.erl rename to test/requirements.erl index 059a369..2c6e5cb 100644 --- a/test/epddl_requirements_typing_test.erl +++ b/test/requirements.erl @@ -1,4 +1,4 @@ --module(epddl_requirements_typing_test). +-module(requirements). -include("../include/epddl_types.hrl").