Branch data Line data Source code
1 : : /****************************************************************************** 2 : : * Top contributors (to current version): 3 : : * Andrew Reynolds, Aina Niemetz, Andres Noetzli 4 : : * 5 : : * This file is part of the cvc5 project. 6 : : * 7 : : * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS 8 : : * in the top-level source directory and their institutional affiliations. 9 : : * All rights reserved. See the file COPYING in the top-level source 10 : : * directory for licensing information. 11 : : * **************************************************************************** 12 : : * 13 : : * Black box testing of cvc5::InteractiveShell for sygus 14 : : */ 15 : : 16 : : #include <cvc5/cvc5.h> 17 : : #include <cvc5/cvc5_parser.h> 18 : : 19 : : #include <memory> 20 : : #include <sstream> 21 : : #include <vector> 22 : : 23 : : #include "main/command_executor.h" 24 : : #include "main/interactive_shell.h" 25 : : #include "options/base_options.h" 26 : : #include "options/language.h" 27 : : #include "options/options.h" 28 : : #include "test.h" 29 : : 30 : : using namespace cvc5::parser; 31 : : 32 : : namespace cvc5::internal { 33 : : namespace test { 34 : : 35 : : class TestMainBlackInteractiveShellSygus : public TestInternal 36 : : { 37 : : protected: 38 : 1 : void SetUp() override 39 : : { 40 : 1 : TestInternal::SetUp(); 41 : : 42 : 1 : d_sin = std::make_unique<std::stringstream>(); 43 : 1 : d_sout = std::make_unique<std::stringstream>(); 44 : : 45 : 1 : d_solver.reset(new cvc5::Solver(d_tm)); 46 : 1 : d_solver->setOption("input-language", "sygus2"); 47 : 1 : d_cexec.reset(new main::CommandExecutor(d_solver)); 48 : 1 : } 49 : : 50 : 1 : void TearDown() override 51 : : { 52 : 1 : d_sin.reset(nullptr); 53 : 1 : d_sout.reset(nullptr); 54 : : // ensure that command executor is destroyed before solver 55 : 1 : d_cexec.reset(nullptr); 56 : 1 : d_solver.reset(nullptr); 57 : 1 : } 58 : : 59 : : /** 60 : : * Read up to maxIterations+1 from the shell and throw an assertion error if 61 : : * it's fewer than minIterations and more than maxIterations. Note that an 62 : : * empty string followed by EOF may be returned as an empty command, and 63 : : * not nullptr (subsequent calls to readAndExecCommands() should return 64 : : * nullptr). E.g., "(synth-fun f (Int) Int)\n" may return two commands: the 65 : : * synth-fun, followed by an empty command, followed by nullptr. 66 : : */ 67 : 1 : void countCommands(InteractiveShell& shell, 68 : : uint32_t minIterations, 69 : : uint32_t maxIterations) 70 : : { 71 : 1 : uint32_t n = 0; 72 [ + - ]: 3 : while (n <= maxIterations) 73 : : { 74 [ + + ]: 3 : if (!shell.readAndExecCommands()) 75 : : { 76 : 1 : break; 77 : : } 78 : 2 : n++; 79 : : } 80 [ - + ]: 1 : ASSERT_LE(n, maxIterations); 81 [ - + ]: 1 : ASSERT_GE(n, minIterations); 82 : : } 83 : : 84 : : std::unique_ptr<std::stringstream> d_sin; 85 : : std::unique_ptr<std::stringstream> d_sout; 86 : : std::unique_ptr<main::CommandExecutor> d_cexec; 87 : : cvc5::TermManager d_tm; 88 : : std::unique_ptr<cvc5::Solver> d_solver; 89 : : }; 90 : : 91 : 2 : TEST_F(TestMainBlackInteractiveShellSygus, test_sygus) 92 : : { 93 : 1 : *d_sin << "(synth-fun f (Int) Int)\n\n" << std::flush; 94 : 2 : InteractiveShell shell(d_cexec.get(), *d_sin, *d_sout); 95 : 1 : countCommands(shell, 1, 2); 96 : 1 : } 97 : : 98 : : } // namespace test 99 : : } // namespace cvc5::internal