package e2e import interpreter.FileLoader import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource import prolog.ast.Database.Program import java.io.ByteArrayOutputStream import java.io.PrintStream @TestInstance(TestInstance.Lifecycle.PER_CLASS) class Examples { private val loader = FileLoader() private lateinit var outStream: ByteArrayOutputStream @BeforeEach fun setup() { Program.reset() outStream = ByteArrayOutputStream() System.setOut(PrintStream(outStream)) } @Test fun debugHelper() { loader.load("examples/basics/backtracking.pl") } @ParameterizedTest @MethodSource("basics") fun `Identical output for basics`(inputFile: String, expected: String) { loader.load("examples/basics/$inputFile") assertEquals(expected, outStream.toString()) } @ParameterizedTest @MethodSource("other") fun `Identical output for other`(inputFile: String, expected: String) { loader.load("examples/$inputFile") assertEquals(expected, outStream.toString()) } fun basics() = listOf( Arguments.of("arithmetics.pl", "gimli is a level 4 fighter with 35 hitpoints.\nlegolas is a level 5 ranger with 30 hitpoints.\ngandalf is a level 10 wizard with 25 hitpoints.\nfrodo is a level 2 rogue with 20 hitpoints.\nlegolas threw gimli, and gimli took 5 damage.\ngimli is a level 4 fighter with 30 hitpoints.\ngandalf casts aid.\ngimli is a level 4 fighter with 35 hitpoints.\nlegolas leveled up.\nlegolas is a level 6 ranger with 30 hitpoints"), Arguments.of("backtracking.pl", "0\ns(0)\ns(s(0))\ns(s(s(0)))\n"), Arguments.of("cut.pl", "0\n"), Arguments.of("disjunction.pl", "Alice likes Italian food.\nBob likes Italian food.\n"), Arguments.of("equality.pl", "X == Y failed\nX = Y succeeded\nX == Y succeeded\nX = Y succeeded\nX == Y succeeded\n"), Arguments.of("forall.pl", "Only alice likes pizza.\n"), Arguments.of("fraternity.pl", "Citizen robespierre is eligible for the event.\nCitizen danton is eligible for the event.\nCitizen camus is eligible for the event.\n"), Arguments.of("liberty.pl", "Give me Liberty, or give me Death!\nI disapprove of what you say, but I will defend to the death your right to say it.\nThe revolution devours its own children.\nSo this is how liberty dies, with thunderous applause.\n"), Arguments.of("unification.pl", "While alice got an A, carol got an A, but bob did not get an A, dave did not get an A, unfortunately.\n"), Arguments.of("write.pl", "gpl zegt: dag(wereld)\n"), ) fun other() = listOf( Arguments.of("program.pl", "10\nhello(world)") ) }