feat: Write
This commit is contained in:
		
							parent
							
								
									1b3280a947
								
							
						
					
					
						commit
						d5632e9217
					
				
					 2 changed files with 104 additions and 0 deletions
				
			
		
							
								
								
									
										19
									
								
								src/prolog/builtins/io.kt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/prolog/builtins/io.kt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| package prolog.builtins | ||||
| 
 | ||||
| import prolog.Answers | ||||
| import prolog.Substitutions | ||||
| import prolog.ast.logic.Satisfiable | ||||
| import prolog.ast.terms.Atom | ||||
| import prolog.ast.terms.Operator | ||||
| import prolog.ast.terms.Term | ||||
| import prolog.logic.applySubstitution | ||||
| 
 | ||||
| class Write(private val term: Term) : Operator(Atom("write"), null, term), Satisfiable { | ||||
|     override fun satisfy(subs: Substitutions): Answers { | ||||
|         val t = applySubstitution(term, subs) | ||||
| 
 | ||||
|         println(t.toString()) | ||||
| 
 | ||||
|         return sequenceOf(Result.success(emptyMap())) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										85
									
								
								tests/prolog/builtins/IoOperatorsTests.kt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								tests/prolog/builtins/IoOperatorsTests.kt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,85 @@ | |||
| package prolog.builtins | ||||
| 
 | ||||
| import org.junit.jupiter.api.Assertions.assertEquals | ||||
| import org.junit.jupiter.api.Assertions.assertTrue | ||||
| import org.junit.jupiter.api.BeforeEach | ||||
| import org.junit.jupiter.api.Test | ||||
| import org.junit.jupiter.params.ParameterizedTest | ||||
| import org.junit.jupiter.params.provider.ValueSource | ||||
| import prolog.ast.arithmetic.Float | ||||
| import prolog.ast.terms.Atom | ||||
| import prolog.ast.terms.CompoundTerm | ||||
| import java.io.ByteArrayOutputStream | ||||
| import java.io.PrintStream | ||||
| import prolog.ast.arithmetic.Integer | ||||
| import prolog.ast.terms.Variable | ||||
| 
 | ||||
| class IoOperatorsTests { | ||||
|     private var outStream = ByteArrayOutputStream() | ||||
| 
 | ||||
|     @BeforeEach | ||||
|     fun setup() { | ||||
|         outStream = ByteArrayOutputStream() | ||||
|         System.setOut(PrintStream(outStream)) | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun dummyTest() { | ||||
|         val message = "Hello, World!" | ||||
|         print(message) | ||||
|         assertEquals(message, outStream.toString(), "Output should match the message") | ||||
|     } | ||||
| 
 | ||||
|     @ParameterizedTest | ||||
|     @ValueSource(strings = [ | ||||
|         "a", | ||||
|         "hello", | ||||
|         "a very special christmas", | ||||
|         "1 2 3 piano" | ||||
|     ]) | ||||
|     fun `write atoms`(name: String) { | ||||
|         val write = Write(Atom(name)) | ||||
| 
 | ||||
|         val result = write.satisfy(emptyMap()).toList() | ||||
| 
 | ||||
|         assertEquals(1, result.size, "Should return one result") | ||||
|         assertTrue(result[0].isSuccess, "Result should be successful") | ||||
|         assertEquals(name, outStream.toString().trim(), "Output should match the atom") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun `write structure`() { | ||||
|         val write = Write(CompoundTerm(Atom("person"), listOf(Atom("john"), Atom("doe")))) | ||||
| 
 | ||||
|         val result = write.satisfy(emptyMap()).toList() | ||||
| 
 | ||||
|         assertEquals(1, result.size, "Should return one result") | ||||
|         assertTrue(result[0].isSuccess, "Result should be successful") | ||||
|         assertEquals("person(john, doe)", outStream.toString().trim(), "Output should match the structure") | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     fun `write arithmetic`() { | ||||
|         val a = Integer(1) | ||||
|         val b = Variable("B") | ||||
|         val c = Float(2.0f) | ||||
|         val d = Variable("D") | ||||
| 
 | ||||
|         val mul = Multiply(c, d) | ||||
|         val sub = Subtract(b, mul) | ||||
|         val expr = EvaluatesTo(a, sub) | ||||
| 
 | ||||
|         val expected1 = "1 =:= B - (2.0 * D)" | ||||
|         val expected2 = "=:=(1, -(B, *(2.0, D)))" | ||||
| 
 | ||||
|         val write = Write(expr) | ||||
| 
 | ||||
|         val result = write.satisfy(emptyMap()).toList() | ||||
| 
 | ||||
|         assertEquals(1, result.size, "Should return one result") | ||||
|         assertTrue(result[0].isSuccess, "Result should be successful") | ||||
| 
 | ||||
|         val output = outStream.toString().trim() | ||||
|         assertTrue(output == expected1 || output == expected2, "Output should match the arithmetic expression") | ||||
|     } | ||||
| } | ||||
		Reference in a new issue