20#include "../pddl_exception.h"
21#include "../pddl_parser.h"
23#include <gtest/gtest.h>
29using namespace pddl_parser;
31TEST(PddlParserTest, TypingTest)
33 auto benchmarks = {R
"delim(
34(define (domain action-arg-pred-missmatch)
35 (:requirements :strips :typing)
44 :parameters (?t - obj-b)
45 :precondition (pred ?t)
46 :effect (not (pred ?t))
50 (define (domain typing-disabled-but-type-defined)
51 (:requirements :strips)
60 :precondition (pred ?t)
61 :effect (not (pred ?t))
65(define (domain typing-disabled-but-type-constant)
66 (:requirements :strips)
75 :precondition (pred ?t)
76 :effect (not (pred ?t))
80(define (domain typing-disabled-but-type-param)
81 (:requirements :strips)
86 :parameters (?t - object)
87 :precondition (pred ?t)
88 :effect (not (pred ?t))
92(define (domain action-unknown-type-in-pred)
93 (:requirements :strips :typing)
101 :parameters (?t - obj-a)
102 :precondition (pred ?t)
103 :effect (not (pred ?t))
107(define (domain action-unknown-type-in-param)
108 (:requirements :strips :typing)
116 :parameters (?t - obj-b)
117 :precondition (pred ?t)
118 :effect (not (pred ?t))
122(define (domain action-unknown-type-in-constant)
123 (:requirements :strips :typing)
134 :parameters (?t - obj-a)
135 :precondition (pred ?t)
136 :effect (not (pred ?t))
140(define (domain action-constant-missmatch)
141 (:requirements :strips :typing)
153 :parameters (?t - obj-a)
154 :precondition (pred TEST_CONST)
155 :effect (not (pred ?t))
158 for (
const auto &s : benchmarks) {
168TEST(PddlParserTest, MinimalDomain)
173(define (domain test-domain)
186 ASSERT_EQ(d.types.size(), 0);
190 ASSERT_EQ(d.actions.size(), 1);
191 ASSERT_EQ(d.actions[0].name, "test-action");
192 ASSERT_EQ(d.
actions[0].action_params.size(), 1);
194 ASSERT_EQ(d.
actions[0].precondition.type, ExpressionType::PREDICATE);
195 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].precondition.expression).function,
"pred");
196 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].precondition.expression).arguments.size(), 0);
198 ASSERT_EQ(d.
actions[0].effect.type, ExpressionType::BOOL);
199 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].effect.expression).function,
"not");
200 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].effect.expression).arguments.size(), 1);
201 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].type,
202 ExpressionType::PREDICATE);
203 ASSERT_EQ(boost::get<Predicate>(
204 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
207 ASSERT_EQ(boost::get<Predicate>(
208 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
213TEST(PddlParserTest, DurativeAction)
218(define (domain test-durative-action)
219 (:requirements :strips :durative-actions)
223 (:durative-action test-action
225 :duration (= ?duration 5.5)
226 :condition (and (at start (pred ?t))
227 (over all (pred ?t)))
228 :effect (and (at end (not (pred ?t)))
229 (at start (pred ?t)))
233 ASSERT_EQ(d.types.size(), 0);
237 ASSERT_EQ(d.actions.size(), 1);
238 ASSERT_EQ(d.actions[0].name, "test-action");
239 ASSERT_EQ(d.
actions[0].duration.type, ExpressionType::VALUE);
240 ASSERT_EQ(boost::get<Atom>(d.
actions[0].duration.expression),
"5.5");
241 ASSERT_EQ(d.
actions[0].action_params.size(), 1);
243 ASSERT_EQ(d.
actions[0].precondition.type, ExpressionType::BOOL);
244 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].precondition.expression).function,
"and");
245 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].precondition.expression).arguments.size(), 2);
246 ASSERT_EQ(boost::get<Predicate>(
247 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[0].expression)
250 ASSERT_EQ(boost::get<Predicate>(
251 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[0].expression)
254 ASSERT_EQ(boost::get<Predicate>(
255 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[0].expression)
258 ExpressionType::PREDICATE);
259 ASSERT_EQ(boost::get<Predicate>(
260 boost::get<Predicate>(
261 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[0].expression)
266 ASSERT_EQ(boost::get<Predicate>(
267 boost::get<Predicate>(
268 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[0].expression)
273 ASSERT_EQ(boost::get<Predicate>(
274 boost::get<Predicate>(
275 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[0].expression)
280 ExpressionType::ATOM);
281 ASSERT_EQ(boost::get<Predicate>(
282 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[1].expression)
285 ASSERT_EQ(boost::get<Predicate>(
286 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[1].expression)
289 ASSERT_EQ(boost::get<Predicate>(
290 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[1].expression)
293 ExpressionType::PREDICATE);
294 ASSERT_EQ(boost::get<Predicate>(
295 boost::get<Predicate>(
296 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[1].expression)
301 ASSERT_EQ(boost::get<Predicate>(
302 boost::get<Predicate>(
303 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[1].expression)
308 ASSERT_EQ(boost::get<Predicate>(
309 boost::get<Predicate>(
310 boost::get<Predicate>(d.
actions[0].precondition.expression).arguments[1].expression)
315 ExpressionType::ATOM);
317 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].effect.expression).function,
"and");
318 ASSERT_EQ(boost::get<Predicate>(d.
actions[0].effect.expression).arguments.size(), 2);
319 ASSERT_EQ(boost::get<Predicate>(
320 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
323 ASSERT_EQ(boost::get<Predicate>(
324 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
327 ASSERT_EQ(boost::get<Predicate>(
328 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
331 ExpressionType::BOOL);
332 ASSERT_EQ(boost::get<Predicate>(
333 boost::get<Predicate>(
334 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
339 ASSERT_EQ(boost::get<Predicate>(
340 boost::get<Predicate>(
341 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
346 ASSERT_EQ(boost::get<Predicate>(
347 boost::get<Predicate>(
348 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
353 ExpressionType::PREDICATE);
354 ASSERT_EQ(boost::get<Predicate>(
355 boost::get<Predicate>(
356 boost::get<Predicate>(
357 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
364 ASSERT_EQ(boost::get<Predicate>(
365 boost::get<Predicate>(
366 boost::get<Predicate>(
367 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
374 ASSERT_EQ(boost::get<Predicate>(
375 boost::get<Predicate>(
376 boost::get<Predicate>(
377 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[0].expression)
384 ExpressionType::ATOM);
385 ASSERT_EQ(boost::get<Predicate>(
386 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[1].expression)
389 ASSERT_EQ(boost::get<Predicate>(
390 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[1].expression)
393 ASSERT_EQ(boost::get<Predicate>(
394 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[1].expression)
397 ExpressionType::PREDICATE);
398 ASSERT_EQ(boost::get<Predicate>(
399 boost::get<Predicate>(
400 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[1].expression)
405 ASSERT_EQ(boost::get<Predicate>(
406 boost::get<Predicate>(
407 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[1].expression)
412 ASSERT_EQ(boost::get<Predicate>(
413 boost::get<Predicate>(
414 boost::get<Predicate>(d.
actions[0].effect.expression).arguments[1].expression)
419 ExpressionType::ATOM);
422TEST(PddlParserTest, Functions)
425(define (domain test-functions)
426 (:requirements :strips :numeric-fluents)
435 :precondition (and (pred ?t)
437 :effect (increase (pred ?t) (pred ?t))
441TEST(PddlParserTest, IPC2014)
443 using recursive_directory_iterator = std::filesystem::recursive_directory_iterator;
444 std::vector<std::string> domains;
445 std::string domain_suffix =
"domain.pddl";
446 for (
const auto &dir : recursive_directory_iterator(std::string(SRCDIR) +
"/ipc2014")) {
447 std::string dirEntry = dir.path().stem().string();
448 std::string file_ending = dir.path().extension().string();
449 if (file_ending ==
".pddl" && dirEntry.find(
"domain") != std::string::npos) {
450 domains.push_back(dir.path().string());
453 for (
const auto &s : domains) {
454 EXPECT_NO_THROW(std::ifstream t(s);
if (t.fail()) {
455 FAIL() <<
" Failed to read file: " << s;
456 } std::stringstream buffer;
Parse a PDDL domain file or problem.
static Domain parseDomain(const std::string &pddl_domain)
Parse the PDDL domain.
Exception thrown by the parser if declared type does not match the defined one.
A structured representation of a PDDL domain.
std::vector< Action > actions
A list of actions defined in the domain.
pairs_multi_consts constants
A typed list of constants defined in the domain.
pairs_type types
A list of types with their super types.
std::vector< predicate_type > predicates
A list of predicate names in the domain, including the types of their arguments.
std::vector< std::string > requirements
A list of PDDL features required by the domain.
std::vector< Function > functions
A list of numeric functions in the domain.