mirror of
https://github.com/irmen/prog8.git
synced 2025-11-23 14:17:51 +00:00
made Position line, col, endcol all 1-based
added a precise (but slow) back face culling routine to the cobra-mk3 example
This commit is contained in:
@@ -6,7 +6,15 @@ import java.nio.file.InvalidPathException
|
|||||||
import kotlin.io.path.Path
|
import kotlin.io.path.Path
|
||||||
|
|
||||||
data class Position(val file: String, val line: Int, val startCol: Int, val endCol: Int) {
|
data class Position(val file: String, val line: Int, val startCol: Int, val endCol: Int) {
|
||||||
override fun toString(): String = "[$file: line $line col ${startCol+1}-${endCol+1}]"
|
override fun toString(): String = "[$file: line $line col ${startCol}-${endCol}]"
|
||||||
|
|
||||||
|
init {
|
||||||
|
if(!file.startsWith('~') ||!file.endsWith('~'))
|
||||||
|
require(line>0 && startCol>=0 && endCol>=startCol) {
|
||||||
|
"Invalid position: $this"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun toClickableStr(): String {
|
fun toClickableStr(): String {
|
||||||
if(this===DUMMY)
|
if(this===DUMMY)
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
@@ -451,7 +451,7 @@ class AsmGen6502Internal (
|
|||||||
if(line.length>=4 && invalid.matchesAt(line, 0)) {
|
if(line.length>=4 && invalid.matchesAt(line, 0)) {
|
||||||
errors.err(
|
errors.err(
|
||||||
"invalid assembly instruction used (not compatible with the 65816 CPU): ${line.trim()}",
|
"invalid assembly instruction used (not compatible with the 65816 CPU): ${line.trim()}",
|
||||||
Position("<output-assemblycode>", index, 1, 1)
|
Position("~output-assemblycode~", index+1, 1, 1)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ class ModuleImporter(private val program: Program,
|
|||||||
|
|
||||||
fun importImplicitLibraryModule(name: String): Module? {
|
fun importImplicitLibraryModule(name: String): Module? {
|
||||||
val import = Directive("%import", listOf(
|
val import = Directive("%import", listOf(
|
||||||
DirectiveArg(name, 42u, position = Position("<<<implicit-import>>>", 0, 0, 0))
|
DirectiveArg(name, 42u, position = Position("~implicit-import~", 0, 0, 0))
|
||||||
), Position("<<<implicit-import>>>", 0, 0, 0))
|
), Position("~implicit-import~", 0, 0, 0))
|
||||||
return executeImportDirective(import, null)
|
return executeImportDirective(import, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -149,8 +149,8 @@ class TestModuleImporter: FunSpec({
|
|||||||
shouldThrow<ParseError> { act() }.let {
|
shouldThrow<ParseError> { act() }.let {
|
||||||
it.position.file shouldBe SourceCode.relative(srcPath).toString()
|
it.position.file shouldBe SourceCode.relative(srcPath).toString()
|
||||||
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
||||||
withClue("startCol; should be 0-based") { it.position.startCol shouldBe 4 }
|
withClue("startCol; should be 1-based") { it.position.startCol shouldBe 5 }
|
||||||
withClue("endCol; should be 0-based") { it.position.endCol shouldBe 6 }
|
withClue("endCol; should be 1-based") { it.position.endCol shouldBe 7 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
program.modules.size shouldBe PROG8_CONTAINER_MODULES.size
|
program.modules.size shouldBe PROG8_CONTAINER_MODULES.size
|
||||||
@@ -169,8 +169,8 @@ class TestModuleImporter: FunSpec({
|
|||||||
shouldThrow<ParseError> { act() }.let {
|
shouldThrow<ParseError> { act() }.let {
|
||||||
it.position.file shouldBe SourceCode.relative(imported).toString()
|
it.position.file shouldBe SourceCode.relative(imported).toString()
|
||||||
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
||||||
withClue("startCol; should be 0-based") { it.position.startCol shouldBe 4 }
|
withClue("startCol; should be 1-based") { it.position.startCol shouldBe 5 }
|
||||||
withClue("endCol; should be 0-based") { it.position.endCol shouldBe 6 }
|
withClue("endCol; should be 1-based") { it.position.endCol shouldBe 7 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
withClue("imported module with error in it should not be present") { program.modules.size shouldBe PROG8_CONTAINER_MODULES.size }
|
withClue("imported module with error in it should not be present") { program.modules.size shouldBe PROG8_CONTAINER_MODULES.size }
|
||||||
@@ -230,8 +230,8 @@ class TestModuleImporter: FunSpec({
|
|||||||
importer.importImplicitLibraryModule(srcPath.nameWithoutExtension) }.let {
|
importer.importImplicitLibraryModule(srcPath.nameWithoutExtension) }.let {
|
||||||
it.position.file shouldBe SourceCode.relative(srcPath).toString()
|
it.position.file shouldBe SourceCode.relative(srcPath).toString()
|
||||||
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
||||||
withClue("startCol; should be 0-based") { it.position.startCol shouldBe 4 }
|
withClue("startCol; should be 1-based") { it.position.startCol shouldBe 5 }
|
||||||
withClue("endCol; should be 0-based") { it.position.endCol shouldBe 6 }
|
withClue("endCol; should be 1-based") { it.position.endCol shouldBe 7 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
program.modules.size shouldBe PROG8_CONTAINER_MODULES.size
|
program.modules.size shouldBe PROG8_CONTAINER_MODULES.size
|
||||||
@@ -252,8 +252,8 @@ class TestModuleImporter: FunSpec({
|
|||||||
act() }.let {
|
act() }.let {
|
||||||
it.position.file shouldBe SourceCode.relative(imported).toString()
|
it.position.file shouldBe SourceCode.relative(imported).toString()
|
||||||
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
withClue("line; should be 1-based") { it.position.line shouldBe 2 }
|
||||||
withClue("startCol; should be 0-based") { it.position.startCol shouldBe 4 }
|
withClue("startCol; should be 1-based") { it.position.startCol shouldBe 5 }
|
||||||
withClue("endCol; should be 0-based") { it.position.endCol shouldBe 6 }
|
withClue("endCol; should be 1-based") { it.position.endCol shouldBe 7 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
withClue("imported module with error in it should not be present") { program.modules.size shouldBe PROG8_CONTAINER_MODULES.size }
|
withClue("imported module with error in it should not be present") { program.modules.size shouldBe PROG8_CONTAINER_MODULES.size }
|
||||||
|
|||||||
@@ -23,10 +23,8 @@ class TestNumericLiteral: FunSpec({
|
|||||||
return lv1.type==lv2.type && lv1==lv2
|
return lv1.type==lv2.type && lv1==lv2
|
||||||
}
|
}
|
||||||
|
|
||||||
val dummyPos = Position("test", 0, 0, 0)
|
|
||||||
|
|
||||||
test("testIdentity") {
|
test("testIdentity") {
|
||||||
val v = NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos)
|
val v = NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY)
|
||||||
(v==v) shouldBe true
|
(v==v) shouldBe true
|
||||||
(v != v) shouldBe false
|
(v != v) shouldBe false
|
||||||
(v <= v) shouldBe true
|
(v <= v) shouldBe true
|
||||||
@@ -34,124 +32,124 @@ class TestNumericLiteral: FunSpec({
|
|||||||
(v < v ) shouldBe false
|
(v < v ) shouldBe false
|
||||||
(v > v ) shouldBe false
|
(v > v ) shouldBe false
|
||||||
|
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos), NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos)) shouldBe true
|
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY), NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
}
|
}
|
||||||
|
|
||||||
test("test truncating avoidance") {
|
test("test truncating avoidance") {
|
||||||
shouldThrow<ExpressionError> {
|
shouldThrow<ExpressionError> {
|
||||||
NumericLiteral(BaseDataType.BYTE, -2.345, dummyPos)
|
NumericLiteral(BaseDataType.BYTE, -2.345, Position.DUMMY)
|
||||||
}.message shouldContain "float value given for integer"
|
}.message shouldContain "float value given for integer"
|
||||||
shouldThrow<ExpressionError> {
|
shouldThrow<ExpressionError> {
|
||||||
NumericLiteral(BaseDataType.BYTE, -2.6, dummyPos)
|
NumericLiteral(BaseDataType.BYTE, -2.6, Position.DUMMY)
|
||||||
}.message shouldContain "float value given for integer"
|
}.message shouldContain "float value given for integer"
|
||||||
shouldThrow<ExpressionError> {
|
shouldThrow<ExpressionError> {
|
||||||
NumericLiteral(BaseDataType.UWORD, 2222.345, dummyPos)
|
NumericLiteral(BaseDataType.UWORD, 2222.345, Position.DUMMY)
|
||||||
}.message shouldContain "float value given for integer"
|
}.message shouldContain "float value given for integer"
|
||||||
NumericLiteral(BaseDataType.UBYTE, 2.0, dummyPos).number shouldBe 2.0
|
NumericLiteral(BaseDataType.UBYTE, 2.0, Position.DUMMY).number shouldBe 2.0
|
||||||
NumericLiteral(BaseDataType.BYTE, -2.0, dummyPos).number shouldBe -2.0
|
NumericLiteral(BaseDataType.BYTE, -2.0, Position.DUMMY).number shouldBe -2.0
|
||||||
NumericLiteral(BaseDataType.UWORD, 2222.0, dummyPos).number shouldBe 2222.0
|
NumericLiteral(BaseDataType.UWORD, 2222.0, Position.DUMMY).number shouldBe 2222.0
|
||||||
NumericLiteral(BaseDataType.FLOAT, 123.456, dummyPos)
|
NumericLiteral(BaseDataType.FLOAT, 123.456, Position.DUMMY)
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testEqualsAndNotEquals") {
|
test("testEqualsAndNotEquals") {
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) == NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) == NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) == NumericLiteral(BaseDataType.UWORD, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) == NumericLiteral(BaseDataType.UWORD, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) == NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) == NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) == NumericLiteral(BaseDataType.UBYTE, 254.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) == NumericLiteral(BaseDataType.UBYTE, 254.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos) == NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY) == NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos) == NumericLiteral(BaseDataType.FLOAT, 12345.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY) == NumericLiteral(BaseDataType.FLOAT, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) == NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) == NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 22239.0, dummyPos) == NumericLiteral(BaseDataType.UWORD, 22239.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 22239.0, Position.DUMMY) == NumericLiteral(BaseDataType.UWORD, 22239.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos) == NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY) == NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos), NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY), NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos), NumericLiteral(BaseDataType.UWORD, 100.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY), NumericLiteral(BaseDataType.UWORD, 100.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos), NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY), NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos), NumericLiteral(BaseDataType.UBYTE, 254.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY), NumericLiteral(BaseDataType.UBYTE, 254.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos), NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos)) shouldBe true
|
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY), NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos), NumericLiteral(BaseDataType.FLOAT, 12345.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY), NumericLiteral(BaseDataType.FLOAT, 12345.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos), NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY), NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 22239.0, dummyPos), NumericLiteral(BaseDataType.UWORD, 22239.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 22239.0, Position.DUMMY), NumericLiteral(BaseDataType.UWORD, 22239.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos), NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos)) shouldBe true
|
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY), NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) != NumericLiteral(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) != NumericLiteral(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) != NumericLiteral(BaseDataType.UWORD, 101.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) != NumericLiteral(BaseDataType.UWORD, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) != NumericLiteral(BaseDataType.FLOAT, 101.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) != NumericLiteral(BaseDataType.FLOAT, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 245.0, dummyPos) != NumericLiteral(BaseDataType.UBYTE, 246.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 245.0, Position.DUMMY) != NumericLiteral(BaseDataType.UBYTE, 246.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos) != NumericLiteral(BaseDataType.UWORD, 12346.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY) != NumericLiteral(BaseDataType.UWORD, 12346.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos) != NumericLiteral(BaseDataType.FLOAT, 12346.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY) != NumericLiteral(BaseDataType.FLOAT, 12346.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos) != NumericLiteral(BaseDataType.UBYTE, 9.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY) != NumericLiteral(BaseDataType.UBYTE, 9.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos) != NumericLiteral(BaseDataType.UWORD, 9.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY) != NumericLiteral(BaseDataType.UWORD, 9.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos) != NumericLiteral(BaseDataType.FLOAT, 9.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY) != NumericLiteral(BaseDataType.FLOAT, 9.0, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos), NumericLiteral(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY), NumericLiteral(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos), NumericLiteral(BaseDataType.UWORD, 101.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY), NumericLiteral(BaseDataType.UWORD, 101.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos), NumericLiteral(BaseDataType.FLOAT, 101.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY), NumericLiteral(BaseDataType.FLOAT, 101.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 245.0, dummyPos), NumericLiteral(BaseDataType.UBYTE, 246.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 245.0, Position.DUMMY), NumericLiteral(BaseDataType.UBYTE, 246.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos), NumericLiteral(BaseDataType.UWORD, 12346.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY), NumericLiteral(BaseDataType.UWORD, 12346.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, dummyPos), NumericLiteral(BaseDataType.FLOAT, 12346.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.UWORD, 12345.0, Position.DUMMY), NumericLiteral(BaseDataType.FLOAT, 12346.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos), NumericLiteral(BaseDataType.UBYTE, 9.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY), NumericLiteral(BaseDataType.UBYTE, 9.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos), NumericLiteral(BaseDataType.UWORD, 9.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY), NumericLiteral(BaseDataType.UWORD, 9.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, dummyPos), NumericLiteral(BaseDataType.FLOAT, 9.0, dummyPos)) shouldBe false
|
sameValueAndType(NumericLiteral(BaseDataType.FLOAT, 9.99, Position.DUMMY), NumericLiteral(BaseDataType.FLOAT, 9.0, Position.DUMMY)) shouldBe false
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testEqualsRef") {
|
test("testEqualsRef") {
|
||||||
(StringLiteral.create("hello", Encoding.PETSCII, dummyPos) == StringLiteral.create("hello", Encoding.PETSCII, dummyPos)) shouldBe true
|
(StringLiteral.create("hello", Encoding.PETSCII, Position.DUMMY) == StringLiteral.create("hello", Encoding.PETSCII, Position.DUMMY)) shouldBe true
|
||||||
(StringLiteral.create("hello", Encoding.PETSCII, dummyPos) != StringLiteral.create("bye", Encoding.PETSCII, dummyPos)) shouldBe true
|
(StringLiteral.create("hello", Encoding.PETSCII, Position.DUMMY) != StringLiteral.create("bye", Encoding.PETSCII, Position.DUMMY)) shouldBe true
|
||||||
(StringLiteral.create("hello", Encoding.SCREENCODES, dummyPos) == StringLiteral.create("hello", Encoding.SCREENCODES, dummyPos)) shouldBe true
|
(StringLiteral.create("hello", Encoding.SCREENCODES, Position.DUMMY) == StringLiteral.create("hello", Encoding.SCREENCODES, Position.DUMMY)) shouldBe true
|
||||||
(StringLiteral.create("hello", Encoding.SCREENCODES, dummyPos) != StringLiteral.create("bye", Encoding.SCREENCODES, dummyPos)) shouldBe true
|
(StringLiteral.create("hello", Encoding.SCREENCODES, Position.DUMMY) != StringLiteral.create("bye", Encoding.SCREENCODES, Position.DUMMY)) shouldBe true
|
||||||
(StringLiteral.create("hello", Encoding.SCREENCODES, dummyPos) != StringLiteral.create("hello", Encoding.PETSCII, dummyPos)) shouldBe true
|
(StringLiteral.create("hello", Encoding.SCREENCODES, Position.DUMMY) != StringLiteral.create("hello", Encoding.PETSCII, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
val lvOne = NumericLiteral(BaseDataType.UBYTE, 1.0, dummyPos)
|
val lvOne = NumericLiteral(BaseDataType.UBYTE, 1.0, Position.DUMMY)
|
||||||
val lvTwo = NumericLiteral(BaseDataType.UBYTE, 2.0, dummyPos)
|
val lvTwo = NumericLiteral(BaseDataType.UBYTE, 2.0, Position.DUMMY)
|
||||||
val lvThree = NumericLiteral(BaseDataType.UBYTE, 3.0, dummyPos)
|
val lvThree = NumericLiteral(BaseDataType.UBYTE, 3.0, Position.DUMMY)
|
||||||
val lvOneR = NumericLiteral(BaseDataType.UBYTE, 1.0, dummyPos)
|
val lvOneR = NumericLiteral(BaseDataType.UBYTE, 1.0, Position.DUMMY)
|
||||||
val lvTwoR = NumericLiteral(BaseDataType.UBYTE, 2.0, dummyPos)
|
val lvTwoR = NumericLiteral(BaseDataType.UBYTE, 2.0, Position.DUMMY)
|
||||||
val lvThreeR = NumericLiteral(BaseDataType.UBYTE, 3.0, dummyPos)
|
val lvThreeR = NumericLiteral(BaseDataType.UBYTE, 3.0, Position.DUMMY)
|
||||||
val lvFour= NumericLiteral(BaseDataType.UBYTE, 4.0, dummyPos)
|
val lvFour= NumericLiteral(BaseDataType.UBYTE, 4.0, Position.DUMMY)
|
||||||
val lv1 = ArrayLiteral(InferredTypes.InferredType.known(DataType.arrayFor(BaseDataType.UBYTE)), arrayOf(lvOne, lvTwo, lvThree), dummyPos)
|
val lv1 = ArrayLiteral(InferredTypes.InferredType.known(DataType.arrayFor(BaseDataType.UBYTE)), arrayOf(lvOne, lvTwo, lvThree), Position.DUMMY)
|
||||||
val lv2 = ArrayLiteral(InferredTypes.InferredType.known(DataType.arrayFor(BaseDataType.UBYTE)), arrayOf(lvOneR, lvTwoR, lvThreeR), dummyPos)
|
val lv2 = ArrayLiteral(InferredTypes.InferredType.known(DataType.arrayFor(BaseDataType.UBYTE)), arrayOf(lvOneR, lvTwoR, lvThreeR), Position.DUMMY)
|
||||||
val lv3 = ArrayLiteral(InferredTypes.InferredType.known(DataType.arrayFor(BaseDataType.UBYTE)), arrayOf(lvOneR, lvTwoR, lvFour), dummyPos)
|
val lv3 = ArrayLiteral(InferredTypes.InferredType.known(DataType.arrayFor(BaseDataType.UBYTE)), arrayOf(lvOneR, lvTwoR, lvFour), Position.DUMMY)
|
||||||
lv1 shouldBe lv2
|
lv1 shouldBe lv2
|
||||||
lv1 shouldNotBe lv3
|
lv1 shouldNotBe lv3
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testGreaterThan") {
|
test("testGreaterThan") {
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) > NumericLiteral(BaseDataType.UBYTE, 99.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) > NumericLiteral(BaseDataType.UBYTE, 99.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) > NumericLiteral(BaseDataType.UWORD, 253.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) > NumericLiteral(BaseDataType.UWORD, 253.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) > NumericLiteral(BaseDataType.FLOAT, 99.9, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) > NumericLiteral(BaseDataType.FLOAT, 99.9, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) >= NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) >= NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) >= NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) >= NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) >= NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) >= NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) > NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) > NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) > NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) > NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) > NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) > NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe false
|
||||||
|
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) >= NumericLiteral(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) >= NumericLiteral(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) >= NumericLiteral(BaseDataType.UWORD, 255.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) >= NumericLiteral(BaseDataType.UWORD, 255.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) >= NumericLiteral(BaseDataType.FLOAT, 100.1, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) >= NumericLiteral(BaseDataType.FLOAT, 100.1, Position.DUMMY)) shouldBe false
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testLessThan") {
|
test("testLessThan") {
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) < NumericLiteral(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) < NumericLiteral(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) < NumericLiteral(BaseDataType.UWORD, 255.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) < NumericLiteral(BaseDataType.UWORD, 255.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) < NumericLiteral(BaseDataType.FLOAT, 100.1, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) < NumericLiteral(BaseDataType.FLOAT, 100.1, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) <= NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) <= NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) <= NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) <= NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe true
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) <= NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe true
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) <= NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) < NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) < NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) < NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) < NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) < NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) < NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe false
|
||||||
|
|
||||||
(NumericLiteral(BaseDataType.UBYTE, 100.0, dummyPos) <= NumericLiteral(BaseDataType.UBYTE, 99.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UBYTE, 100.0, Position.DUMMY) <= NumericLiteral(BaseDataType.UBYTE, 99.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.UWORD, 254.0, dummyPos) <= NumericLiteral(BaseDataType.UWORD, 253.0, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.UWORD, 254.0, Position.DUMMY) <= NumericLiteral(BaseDataType.UWORD, 253.0, Position.DUMMY)) shouldBe false
|
||||||
(NumericLiteral(BaseDataType.FLOAT, 100.0, dummyPos) <= NumericLiteral(BaseDataType.FLOAT, 99.9, dummyPos)) shouldBe false
|
(NumericLiteral(BaseDataType.FLOAT, 100.0, Position.DUMMY) <= NumericLiteral(BaseDataType.FLOAT, 99.9, Position.DUMMY)) shouldBe false
|
||||||
}
|
}
|
||||||
|
|
||||||
test("optimalInteger") {
|
test("optimalInteger") {
|
||||||
|
|||||||
@@ -20,10 +20,8 @@ class TestPtNumber: FunSpec({
|
|||||||
return lv1.type==lv2.type && lv1==lv2
|
return lv1.type==lv2.type && lv1==lv2
|
||||||
}
|
}
|
||||||
|
|
||||||
val dummyPos = Position("test", 0, 0, 0)
|
|
||||||
|
|
||||||
test("testIdentity") {
|
test("testIdentity") {
|
||||||
val v = PtNumber(BaseDataType.UWORD, 12345.0, dummyPos)
|
val v = PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY)
|
||||||
(v==v) shouldBe true
|
(v==v) shouldBe true
|
||||||
(v != v) shouldBe false
|
(v != v) shouldBe false
|
||||||
(v <= v) shouldBe true
|
(v <= v) shouldBe true
|
||||||
@@ -31,127 +29,127 @@ class TestPtNumber: FunSpec({
|
|||||||
(v < v ) shouldBe false
|
(v < v ) shouldBe false
|
||||||
(v > v ) shouldBe false
|
(v > v ) shouldBe false
|
||||||
|
|
||||||
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos), PtNumber(BaseDataType.UWORD, 12345.0, dummyPos)) shouldBe true
|
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY), PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
}
|
}
|
||||||
|
|
||||||
test("test truncating") {
|
test("test truncating") {
|
||||||
shouldThrow<IllegalArgumentException> {
|
shouldThrow<IllegalArgumentException> {
|
||||||
PtNumber(BaseDataType.BYTE, -2.345, dummyPos)
|
PtNumber(BaseDataType.BYTE, -2.345, Position.DUMMY)
|
||||||
}.message shouldContain "refused truncating"
|
}.message shouldContain "refused truncating"
|
||||||
shouldThrow<IllegalArgumentException> {
|
shouldThrow<IllegalArgumentException> {
|
||||||
PtNumber(BaseDataType.BYTE, -2.6, dummyPos)
|
PtNumber(BaseDataType.BYTE, -2.6, Position.DUMMY)
|
||||||
}.message shouldContain "refused truncating"
|
}.message shouldContain "refused truncating"
|
||||||
shouldThrow<IllegalArgumentException> {
|
shouldThrow<IllegalArgumentException> {
|
||||||
PtNumber(BaseDataType.UWORD, 2222.345, dummyPos)
|
PtNumber(BaseDataType.UWORD, 2222.345, Position.DUMMY)
|
||||||
}.message shouldContain "refused truncating"
|
}.message shouldContain "refused truncating"
|
||||||
PtNumber(BaseDataType.UBYTE, 2.0, dummyPos).number shouldBe 2.0
|
PtNumber(BaseDataType.UBYTE, 2.0, Position.DUMMY).number shouldBe 2.0
|
||||||
PtNumber(BaseDataType.BYTE, -2.0, dummyPos).number shouldBe -2.0
|
PtNumber(BaseDataType.BYTE, -2.0, Position.DUMMY).number shouldBe -2.0
|
||||||
PtNumber(BaseDataType.UWORD, 2222.0, dummyPos).number shouldBe 2222.0
|
PtNumber(BaseDataType.UWORD, 2222.0, Position.DUMMY).number shouldBe 2222.0
|
||||||
PtNumber(BaseDataType.FLOAT, 123.456, dummyPos)
|
PtNumber(BaseDataType.FLOAT, 123.456, Position.DUMMY)
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testEqualsAndNotEquals") {
|
test("testEqualsAndNotEquals") {
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) == PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) == PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) == PtNumber(BaseDataType.UWORD, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) == PtNumber(BaseDataType.UWORD, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) == PtNumber(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) == PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) == PtNumber(BaseDataType.UBYTE, 254.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) == PtNumber(BaseDataType.UBYTE, 254.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos) == PtNumber(BaseDataType.UWORD, 12345.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY) == PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos) == PtNumber(BaseDataType.FLOAT, 12345.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY) == PtNumber(BaseDataType.FLOAT, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) == PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) == PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 22239.0, dummyPos) == PtNumber(BaseDataType.UWORD, 22239.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 22239.0, Position.DUMMY) == PtNumber(BaseDataType.UWORD, 22239.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos) == PtNumber(BaseDataType.FLOAT, 9.99, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY) == PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos), PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY), PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos), PtNumber(BaseDataType.UWORD, 100.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY), PtNumber(BaseDataType.UWORD, 100.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos), PtNumber(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY), PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UWORD, 254.0, dummyPos), PtNumber(BaseDataType.UBYTE, 254.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY), PtNumber(BaseDataType.UBYTE, 254.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos), PtNumber(BaseDataType.UWORD, 12345.0, dummyPos)) shouldBe true
|
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY), PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY)) shouldBe true
|
||||||
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos), PtNumber(BaseDataType.FLOAT, 12345.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY), PtNumber(BaseDataType.FLOAT, 12345.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos), PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY), PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.FLOAT, 22239.0, dummyPos), PtNumber(BaseDataType.UWORD, 22239.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.FLOAT, 22239.0, Position.DUMMY), PtNumber(BaseDataType.UWORD, 22239.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos), PtNumber(BaseDataType.FLOAT, 9.99, dummyPos)) shouldBe true
|
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY), PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) != PtNumber(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) != PtNumber(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) != PtNumber(BaseDataType.UWORD, 101.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) != PtNumber(BaseDataType.UWORD, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) != PtNumber(BaseDataType.FLOAT, 101.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) != PtNumber(BaseDataType.FLOAT, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 245.0, dummyPos) != PtNumber(BaseDataType.UBYTE, 246.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 245.0, Position.DUMMY) != PtNumber(BaseDataType.UBYTE, 246.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos) != PtNumber(BaseDataType.UWORD, 12346.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY) != PtNumber(BaseDataType.UWORD, 12346.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos) != PtNumber(BaseDataType.FLOAT, 12346.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY) != PtNumber(BaseDataType.FLOAT, 12346.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos) != PtNumber(BaseDataType.UBYTE, 9.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY) != PtNumber(BaseDataType.UBYTE, 9.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos) != PtNumber(BaseDataType.UWORD, 9.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY) != PtNumber(BaseDataType.UWORD, 9.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos) != PtNumber(BaseDataType.FLOAT, 9.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY) != PtNumber(BaseDataType.FLOAT, 9.0, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos), PtNumber(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY), PtNumber(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos), PtNumber(BaseDataType.UWORD, 101.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY), PtNumber(BaseDataType.UWORD, 101.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos), PtNumber(BaseDataType.FLOAT, 101.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY), PtNumber(BaseDataType.FLOAT, 101.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UWORD, 245.0, dummyPos), PtNumber(BaseDataType.UBYTE, 246.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UWORD, 245.0, Position.DUMMY), PtNumber(BaseDataType.UBYTE, 246.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos), PtNumber(BaseDataType.UWORD, 12346.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY), PtNumber(BaseDataType.UWORD, 12346.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, dummyPos), PtNumber(BaseDataType.FLOAT, 12346.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.UWORD, 12345.0, Position.DUMMY), PtNumber(BaseDataType.FLOAT, 12346.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos), PtNumber(BaseDataType.UBYTE, 9.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY), PtNumber(BaseDataType.UBYTE, 9.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos), PtNumber(BaseDataType.UWORD, 9.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY), PtNumber(BaseDataType.UWORD, 9.0, Position.DUMMY)) shouldBe false
|
||||||
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, dummyPos), PtNumber(BaseDataType.FLOAT, 9.0, dummyPos)) shouldBe false
|
sameValueAndType(PtNumber(BaseDataType.FLOAT, 9.99, Position.DUMMY), PtNumber(BaseDataType.FLOAT, 9.0, Position.DUMMY)) shouldBe false
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testEqualsRef") {
|
test("testEqualsRef") {
|
||||||
(PtString("hello", Encoding.PETSCII, dummyPos) == PtString("hello", Encoding.PETSCII, dummyPos)) shouldBe true
|
(PtString("hello", Encoding.PETSCII, Position.DUMMY) == PtString("hello", Encoding.PETSCII, Position.DUMMY)) shouldBe true
|
||||||
(PtString("hello", Encoding.PETSCII, dummyPos) != PtString("bye", Encoding.PETSCII, dummyPos)) shouldBe true
|
(PtString("hello", Encoding.PETSCII, Position.DUMMY) != PtString("bye", Encoding.PETSCII, Position.DUMMY)) shouldBe true
|
||||||
(PtString("hello", Encoding.SCREENCODES, dummyPos) == PtString("hello", Encoding.SCREENCODES, dummyPos)) shouldBe true
|
(PtString("hello", Encoding.SCREENCODES, Position.DUMMY) == PtString("hello", Encoding.SCREENCODES, Position.DUMMY)) shouldBe true
|
||||||
(PtString("hello", Encoding.SCREENCODES, dummyPos) != PtString("bye", Encoding.SCREENCODES, dummyPos)) shouldBe true
|
(PtString("hello", Encoding.SCREENCODES, Position.DUMMY) != PtString("bye", Encoding.SCREENCODES, Position.DUMMY)) shouldBe true
|
||||||
(PtString("hello", Encoding.SCREENCODES, dummyPos) != PtString("hello", Encoding.PETSCII, dummyPos)) shouldBe true
|
(PtString("hello", Encoding.SCREENCODES, Position.DUMMY) != PtString("hello", Encoding.PETSCII, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
val lvOne = PtNumber(BaseDataType.UBYTE, 1.0, dummyPos)
|
val lvOne = PtNumber(BaseDataType.UBYTE, 1.0, Position.DUMMY)
|
||||||
val lvTwo = PtNumber(BaseDataType.UBYTE, 2.0, dummyPos)
|
val lvTwo = PtNumber(BaseDataType.UBYTE, 2.0, Position.DUMMY)
|
||||||
val lvThree = PtNumber(BaseDataType.UBYTE, 3.0, dummyPos)
|
val lvThree = PtNumber(BaseDataType.UBYTE, 3.0, Position.DUMMY)
|
||||||
val lvOneR = PtNumber(BaseDataType.UBYTE, 1.0, dummyPos)
|
val lvOneR = PtNumber(BaseDataType.UBYTE, 1.0, Position.DUMMY)
|
||||||
val lvTwoR = PtNumber(BaseDataType.UBYTE, 2.0, dummyPos)
|
val lvTwoR = PtNumber(BaseDataType.UBYTE, 2.0, Position.DUMMY)
|
||||||
val lvThreeR = PtNumber(BaseDataType.UBYTE, 3.0, dummyPos)
|
val lvThreeR = PtNumber(BaseDataType.UBYTE, 3.0, Position.DUMMY)
|
||||||
val lvFour= PtNumber(BaseDataType.UBYTE, 4.0, dummyPos)
|
val lvFour= PtNumber(BaseDataType.UBYTE, 4.0, Position.DUMMY)
|
||||||
val lv1 = PtArray(DataType.arrayFor(BaseDataType.UBYTE), dummyPos)
|
val lv1 = PtArray(DataType.arrayFor(BaseDataType.UBYTE), Position.DUMMY)
|
||||||
arrayOf(lvOne, lvTwo, lvThree).forEach { lv1.add(it) }
|
arrayOf(lvOne, lvTwo, lvThree).forEach { lv1.add(it) }
|
||||||
val lv2 = PtArray(DataType.arrayFor(BaseDataType.UBYTE), dummyPos)
|
val lv2 = PtArray(DataType.arrayFor(BaseDataType.UBYTE), Position.DUMMY)
|
||||||
arrayOf(lvOneR, lvTwoR, lvThreeR).forEach { lv2.add(it) }
|
arrayOf(lvOneR, lvTwoR, lvThreeR).forEach { lv2.add(it) }
|
||||||
val lv3 = PtArray(DataType.arrayFor(BaseDataType.UBYTE), dummyPos)
|
val lv3 = PtArray(DataType.arrayFor(BaseDataType.UBYTE), Position.DUMMY)
|
||||||
arrayOf(lvOneR, lvTwoR, lvFour).forEach { lv3.add(it) }
|
arrayOf(lvOneR, lvTwoR, lvFour).forEach { lv3.add(it) }
|
||||||
lv1 shouldBe lv2
|
lv1 shouldBe lv2
|
||||||
lv1 shouldNotBe lv3
|
lv1 shouldNotBe lv3
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testGreaterThan") {
|
test("testGreaterThan") {
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) > PtNumber(BaseDataType.UBYTE, 99.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) > PtNumber(BaseDataType.UBYTE, 99.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) > PtNumber(BaseDataType.UWORD, 253.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) > PtNumber(BaseDataType.UWORD, 253.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) > PtNumber(BaseDataType.FLOAT, 99.9, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) > PtNumber(BaseDataType.FLOAT, 99.9, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) >= PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) >= PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) >= PtNumber(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) >= PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) >= PtNumber(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) >= PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) > PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) > PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) > PtNumber(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) > PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) > PtNumber(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) > PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe false
|
||||||
|
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) >= PtNumber(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) >= PtNumber(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) >= PtNumber(BaseDataType.UWORD, 255.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) >= PtNumber(BaseDataType.UWORD, 255.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) >= PtNumber(BaseDataType.FLOAT, 100.1, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) >= PtNumber(BaseDataType.FLOAT, 100.1, Position.DUMMY)) shouldBe false
|
||||||
}
|
}
|
||||||
|
|
||||||
test("testLessThan") {
|
test("testLessThan") {
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) < PtNumber(BaseDataType.UBYTE, 101.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) < PtNumber(BaseDataType.UBYTE, 101.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) < PtNumber(BaseDataType.UWORD, 255.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) < PtNumber(BaseDataType.UWORD, 255.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) < PtNumber(BaseDataType.FLOAT, 100.1, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) < PtNumber(BaseDataType.FLOAT, 100.1, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) <= PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) <= PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) <= PtNumber(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) <= PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe true
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) <= PtNumber(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe true
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) <= PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe true
|
||||||
|
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) < PtNumber(BaseDataType.UBYTE, 100.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) < PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) < PtNumber(BaseDataType.UWORD, 254.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) < PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) < PtNumber(BaseDataType.FLOAT, 100.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) < PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY)) shouldBe false
|
||||||
|
|
||||||
(PtNumber(BaseDataType.UBYTE, 100.0, dummyPos) <= PtNumber(BaseDataType.UBYTE, 99.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UBYTE, 100.0, Position.DUMMY) <= PtNumber(BaseDataType.UBYTE, 99.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.UWORD, 254.0, dummyPos) <= PtNumber(BaseDataType.UWORD, 253.0, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.UWORD, 254.0, Position.DUMMY) <= PtNumber(BaseDataType.UWORD, 253.0, Position.DUMMY)) shouldBe false
|
||||||
(PtNumber(BaseDataType.FLOAT, 100.0, dummyPos) <= PtNumber(BaseDataType.FLOAT, 99.9, dummyPos)) shouldBe false
|
(PtNumber(BaseDataType.FLOAT, 100.0, Position.DUMMY) <= PtNumber(BaseDataType.FLOAT, 99.9, Position.DUMMY)) shouldBe false
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -271,14 +271,14 @@ class TestProg8Parser: FunSpec( {
|
|||||||
val srcText = "bad * { }\n"
|
val srcText = "bad * { }\n"
|
||||||
|
|
||||||
val e = shouldThrow<ParseError> { parseModule(SourceCode.Text(srcText)) }
|
val e = shouldThrow<ParseError> { parseModule(SourceCode.Text(srcText)) }
|
||||||
assertPosition(e.position, Regex("^string:[0-9a-f\\-]+$"), 1, 4, 4)
|
assertPosition(e.position, Regex("^string:[0-9a-f\\-]+$"), 1, 5, 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
test("in ParseError from bad file source code") {
|
test("in ParseError from bad file source code") {
|
||||||
val path = assumeReadableFile(fixturesDir, "ast_file_with_syntax_error.p8")
|
val path = assumeReadableFile(fixturesDir, "ast_file_with_syntax_error.p8")
|
||||||
|
|
||||||
val e = shouldThrow<ParseError> { parseModule(ImportFileSystem.getFile(path)) }
|
val e = shouldThrow<ParseError> { parseModule(ImportFileSystem.getFile(path)) }
|
||||||
assertPosition(e.position, SourceCode.relative(path).toString(), 2, 4)
|
assertPosition(e.position, SourceCode.relative(path).toString(), 2, 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
test("of Module parsed from a string") {
|
test("of Module parsed from a string") {
|
||||||
@@ -327,7 +327,7 @@ class TestProg8Parser: FunSpec( {
|
|||||||
val mpf = module.position.file
|
val mpf = module.position.file
|
||||||
|
|
||||||
val targetDirective = module.statements.filterIsInstance<Directive>()[0]
|
val targetDirective = module.statements.filterIsInstance<Directive>()[0]
|
||||||
assertPositionOf(targetDirective, mpf, 1, 1, 8)
|
assertPositionOf(targetDirective, mpf, 1, 1, 9)
|
||||||
val mainBlock = module.statements.filterIsInstance<Block>()[0]
|
val mainBlock = module.statements.filterIsInstance<Block>()[0]
|
||||||
assertPositionOf(mainBlock, mpf, 2, 1, 4)
|
assertPositionOf(mainBlock, mpf, 2, 1, 4)
|
||||||
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
|
val startSub = mainBlock.statements.filterIsInstance<Subroutine>()[0]
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import prog8.code.source.SourceCode
|
|||||||
|
|
||||||
|
|
||||||
object ParentSentinel : Node {
|
object ParentSentinel : Node {
|
||||||
override val position = Position("<<sentinel>>", 0, 0, 0)
|
override val position = Position("~sentinel~", 0, 0, 0)
|
||||||
override var parent: Node = this
|
override var parent: Node = this
|
||||||
override fun linkParents(parent: Node) {}
|
override fun linkParents(parent: Node) {}
|
||||||
override fun replaceChildNode(node: Node, replacement: Node) {
|
override fun replaceChildNode(node: Node, replacement: Node) {
|
||||||
@@ -394,7 +394,7 @@ open class Module(final override val statements: MutableList<Statement>,
|
|||||||
|
|
||||||
class GlobalNamespace(val modules: MutableList<Module>): Node, INameScope {
|
class GlobalNamespace(val modules: MutableList<Module>): Node, INameScope {
|
||||||
override val name = "<<<global>>>"
|
override val name = "<<<global>>>"
|
||||||
override val position = Position("<<<global>>>", 0, 0, 0)
|
override val position = Position("~global~", 0, 0, 0)
|
||||||
override val statements = mutableListOf<Statement>() // not used
|
override val statements = mutableListOf<Statement>() // not used
|
||||||
override var parent: Node = ParentSentinel
|
override var parent: Node = ParentSentinel
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ class Antlr2KotlinVisitor(val source: SourceCode): AbstractParseTreeVisitor<Node
|
|||||||
|
|
||||||
override fun visitDirective(ctx: DirectiveContext): Directive {
|
override fun visitDirective(ctx: DirectiveContext): Directive {
|
||||||
val pos = ctx.toPosition()
|
val pos = ctx.toPosition()
|
||||||
val position = Position(pos.file, pos.line, pos.startCol, ctx.directivename().UNICODEDNAME().symbol.stopIndex)
|
val end = ctx.directivename().UNICODEDNAME().symbol.stopIndex - ctx.directivename().UNICODEDNAME().symbol.startIndex
|
||||||
|
val position = Position(pos.file, pos.line, pos.startCol, pos.startCol+end+1)
|
||||||
if(ctx.directivenamelist() != null) {
|
if(ctx.directivenamelist() != null) {
|
||||||
val namelist = ctx.directivenamelist().scoped_identifier().map { it.accept(this) as IdentifierReference }
|
val namelist = ctx.directivenamelist().scoped_identifier().map { it.accept(this) as IdentifierReference }
|
||||||
val identifiers = namelist.map { DirectiveArg(it.nameInSource.joinToString("."), null, it.position) }
|
val identifiers = namelist.map { DirectiveArg(it.nameInSource.joinToString("."), null, it.position) }
|
||||||
@@ -505,7 +506,7 @@ class Antlr2KotlinVisitor(val source: SourceCode): AbstractParseTreeVisitor<Node
|
|||||||
|
|
||||||
val (registerorpair, statusregister) = parseParamRegister(pctx.register, pctx.toPosition())
|
val (registerorpair, statusregister) = parseParamRegister(pctx.register, pctx.toPosition())
|
||||||
if(statusregister!=null) {
|
if(statusregister!=null) {
|
||||||
throw SyntaxError("can't use status register as param for normal subroutines", Position(pctx.toPosition().file, pctx.register.line, pctx.register.charPositionInLine, pctx.register.charPositionInLine+1))
|
throw SyntaxError("can't use status register as param for normal subroutines", Position(pctx.toPosition().file, pctx.register.line, pctx.register.charPositionInLine+1, pctx.register.charPositionInLine+1))
|
||||||
}
|
}
|
||||||
return SubroutineParameter(identifiername, datatype, zp, registerorpair, pctx.toPosition())
|
return SubroutineParameter(identifiername, datatype, zp, registerorpair, pctx.toPosition())
|
||||||
}
|
}
|
||||||
@@ -713,7 +714,8 @@ class Antlr2KotlinVisitor(val source: SourceCode): AbstractParseTreeVisitor<Node
|
|||||||
pathString
|
pathString
|
||||||
}
|
}
|
||||||
// note: beware of TAB characters in the source text, they count as 1 column...
|
// note: beware of TAB characters in the source text, they count as 1 column...
|
||||||
return Position(filename, start.line, start.charPositionInLine+1, start.charPositionInLine + 1 + start.stopIndex - start.startIndex)
|
val endOffset = if(start.startIndex<0 || start.stopIndex<0) 0 else start.stopIndex - start.startIndex
|
||||||
|
return Position(filename, start.line, start.charPositionInLine+1, start.charPositionInLine + 1 + endOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getZpOption(tags: List<String>): ZeropageWish = when {
|
private fun getZpOption(tags: List<String>): ZeropageWish = when {
|
||||||
@@ -754,7 +756,7 @@ class Antlr2KotlinVisitor(val source: SourceCode): AbstractParseTreeVisitor<Node
|
|||||||
in RegisterOrPair.names -> registerorpair = RegisterOrPair.valueOf(register)
|
in RegisterOrPair.names -> registerorpair = RegisterOrPair.valueOf(register)
|
||||||
in Statusflag.names -> statusregister = Statusflag.valueOf(register)
|
in Statusflag.names -> statusregister = Statusflag.valueOf(register)
|
||||||
else -> {
|
else -> {
|
||||||
throw SyntaxError("invalid register or status flag", Position(pos.file, registerTok.line, registerTok.charPositionInLine, registerTok.charPositionInLine+1))
|
throw SyntaxError("invalid register or status flag", Position(pos.file, registerTok.line, registerTok.charPositionInLine+1, registerTok.charPositionInLine+1))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,10 +59,10 @@ object Prog8Parser {
|
|||||||
private class AntlrErrorListener(val src: SourceCode): BaseErrorListener() {
|
private class AntlrErrorListener(val src: SourceCode): BaseErrorListener() {
|
||||||
override fun syntaxError(recognizer: Recognizer<*, *>?, offendingSymbol: Any?, line: Int, charPositionInLine: Int, msg: String, e: RecognitionException?) {
|
override fun syntaxError(recognizer: Recognizer<*, *>?, offendingSymbol: Any?, line: Int, charPositionInLine: Int, msg: String, e: RecognitionException?) {
|
||||||
if (e == null) {
|
if (e == null) {
|
||||||
throw ParseError(msg, Position(src.origin, line, charPositionInLine, charPositionInLine), RuntimeException("parse error"))
|
throw ParseError(msg, Position(src.origin, line, charPositionInLine+1, charPositionInLine+1), RuntimeException("parse error"))
|
||||||
} else {
|
} else {
|
||||||
if(e.offendingToken==null) {
|
if(e.offendingToken==null) {
|
||||||
throw ParseError(msg, Position(src.origin, line, charPositionInLine, charPositionInLine), e)
|
throw ParseError(msg, Position(src.origin, line, charPositionInLine+1, charPositionInLine+1), e)
|
||||||
} else {
|
} else {
|
||||||
throw ParseError(msg, e.getPosition(src.origin), e)
|
throw ParseError(msg, e.getPosition(src.origin), e)
|
||||||
}
|
}
|
||||||
@@ -74,8 +74,8 @@ object Prog8Parser {
|
|||||||
val offending = this.offendingToken
|
val offending = this.offendingToken
|
||||||
val line = offending.line
|
val line = offending.line
|
||||||
val beginCol = offending.charPositionInLine
|
val beginCol = offending.charPositionInLine
|
||||||
val endCol = beginCol + offending.stopIndex - offending.startIndex
|
val endOffset = if(offending.startIndex<0 || offending.stopIndex<0 || offending.stopIndex<=offending.startIndex) 0 else offending.stopIndex - offending.startIndex
|
||||||
return Position(file, line, beginCol, endCol)
|
return Position(file, line, beginCol+1, beginCol+1+endOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ Future Things and Ideas
|
|||||||
- struct/ptr: (later, nasty parser problem:) support chaining pointer dereference on function calls that return a pointer. (type checking now fails on stuff like func().field and func().next.field)
|
- struct/ptr: (later, nasty parser problem:) support chaining pointer dereference on function calls that return a pointer. (type checking now fails on stuff like func().field and func().next.field)
|
||||||
- make $8000000 a valid long integer (-2147483648) this is more involved than you think. To make this work: long \|= $80000000
|
- make $8000000 a valid long integer (-2147483648) this is more involved than you think. To make this work: long \|= $80000000
|
||||||
- make memory mapped variables support more constant expressions such as: &uword MyHigh = &mylong1+2
|
- make memory mapped variables support more constant expressions such as: &uword MyHigh = &mylong1+2
|
||||||
- fix the line, cols in Position, sometimes they count from 0 sometimes from 1, should both always be 1-based (is this the reason some source lines end up missing in the IR file?)
|
|
||||||
- handle Alias in a general way in LiteralsToAutoVarsAndRecombineIdentifiers instead of replacing it scattered over multiple functions
|
- handle Alias in a general way in LiteralsToAutoVarsAndRecombineIdentifiers instead of replacing it scattered over multiple functions
|
||||||
- After long variable type is completed: make all constants long by default (remove type name altogether), reduce to target type implictly if the actual value fits.
|
- After long variable type is completed: make all constants long by default (remove type name altogether), reduce to target type implictly if the actual value fits.
|
||||||
This will break some existing programs that depend on value wrap arounds, but gives more intuitive constant number handling.
|
This will break some existing programs that depend on value wrap arounds, but gives more intuitive constant number handling.
|
||||||
|
|||||||
@@ -3,11 +3,10 @@
|
|||||||
%import math
|
%import math
|
||||||
%import monogfx
|
%import monogfx
|
||||||
%import verafx
|
%import verafx
|
||||||
|
%import floats
|
||||||
|
|
||||||
; TODO add FPS counter
|
; TODO add FPS counter
|
||||||
; TODO fix the camera normal calculation for the hidden surface removal
|
|
||||||
; TODO add all other Elite's ships, show their name, advance to next ship on keypress
|
; TODO add all other Elite's ships, show their name, advance to next ship on keypress
|
||||||
; TODO embed pre calculated surface normals???
|
|
||||||
|
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
@@ -83,7 +82,7 @@ main {
|
|||||||
ubyte @zp pointIdx = 0
|
ubyte @zp pointIdx = 0
|
||||||
ubyte faceNumber
|
ubyte faceNumber
|
||||||
for faceNumber in shipdata.totalNumberOfFaces -1 downto 0 {
|
for faceNumber in shipdata.totalNumberOfFaces -1 downto 0 {
|
||||||
if matrix_math.facing_away(pointIdx) {
|
if matrix_math.facing_away_fast_but_imprecise(pointIdx) { ;; can also use matrix_math.facing_away_slow_but_precise(pointIdx)
|
||||||
; don't draw this face, fast-forward over the edges and points
|
; don't draw this face, fast-forward over the edges and points
|
||||||
edgeIdx += 3 ; every face hast at least 3 edges
|
edgeIdx += 3 ; every face hast at least 3 edges
|
||||||
while shipdata.facesEdges[edgeIdx]!=255 {
|
while shipdata.facesEdges[edgeIdx]!=255 {
|
||||||
@@ -180,14 +179,15 @@ matrix_math {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub facing_away(ubyte edgePointsIdx) -> bool {
|
sub facing_away_fast_but_imprecise(ubyte edgePointsIdx) -> bool {
|
||||||
; simplistic visibility determination by checking the Z component of the surface normal
|
; simplistic visibility determination by checking the Z component of the surface normal
|
||||||
; TODO: actually take the line of sight vector into account
|
; this only compares the surface normal to the screen space vector which doesn't yield the proper perspective correct result, but is fast
|
||||||
ubyte p1 = shipdata.facesPoints[edgePointsIdx]
|
ubyte p1 = shipdata.facesPoints[edgePointsIdx]
|
||||||
edgePointsIdx++
|
edgePointsIdx++
|
||||||
ubyte p2 = shipdata.facesPoints[edgePointsIdx]
|
ubyte p2 = shipdata.facesPoints[edgePointsIdx]
|
||||||
edgePointsIdx++
|
edgePointsIdx++
|
||||||
ubyte p3 = shipdata.facesPoints[edgePointsIdx]
|
ubyte p3 = shipdata.facesPoints[edgePointsIdx]
|
||||||
|
|
||||||
word p1x = rotatedx[p1] / 128
|
word p1x = rotatedx[p1] / 128
|
||||||
word p1y = rotatedy[p1] / 128
|
word p1y = rotatedy[p1] / 128
|
||||||
word p2x = rotatedx[p2] / 128
|
word p2x = rotatedx[p2] / 128
|
||||||
@@ -196,6 +196,39 @@ matrix_math {
|
|||||||
word p3y = rotatedy[p3] / 128
|
word p3y = rotatedy[p3] / 128
|
||||||
return (p2x-p3x)*(p1y-p3y) - (p2y-p3y)*(p1x-p3x) > 0
|
return (p2x-p3x)*(p1y-p3y) - (p2y-p3y)*(p1x-p3x) > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub facing_away_slow_but_precise(ubyte edgePointsIdx) -> bool {
|
||||||
|
; determine visibility by calculating the dot product of surface normal and view vector
|
||||||
|
ubyte p1 = shipdata.facesPoints[edgePointsIdx]
|
||||||
|
edgePointsIdx++
|
||||||
|
ubyte p2 = shipdata.facesPoints[edgePointsIdx]
|
||||||
|
edgePointsIdx++
|
||||||
|
ubyte p3 = shipdata.facesPoints[edgePointsIdx]
|
||||||
|
|
||||||
|
; Calculate two edge vectors of the triangle (scaled by 2)
|
||||||
|
word v1x = (rotatedx[p2] - rotatedx[p1])/128
|
||||||
|
word v1y = (rotatedy[p2] - rotatedy[p1])/128
|
||||||
|
word v1z = (rotatedz[p2] - rotatedz[p1])/128
|
||||||
|
word v2x = (rotatedx[p3] - rotatedx[p1])/128
|
||||||
|
word v2y = (rotatedy[p3] - rotatedy[p1])/128
|
||||||
|
word v2z = (rotatedz[p3] - rotatedz[p1])/128
|
||||||
|
|
||||||
|
; Calculate surface normal using cross product: N = V1 x V2 (scaled by 4)
|
||||||
|
; Note: because of lack of precision in the 16 bit word math, we need to use floating point math here.... :-(
|
||||||
|
; Elite had a more optimized version of this algorithm that still used fixed point integer math only...
|
||||||
|
float normalx = (v1y * v2z - v1z * v2y) as float
|
||||||
|
float normaly = (v1z * v2x - v1x * v2z) as float
|
||||||
|
float normalz = (v1x * v2y - v1y * v2x) as float
|
||||||
|
|
||||||
|
; Calculate view vector from camera (0,0,-170) to point p1 (scaled by 4)
|
||||||
|
float viewx = rotatedx[p1]/(256/4) - 0 as float ; from camera x to point x
|
||||||
|
float viewy = rotatedy[p1]/(256/4) - 0 as float ; from camera y to point y
|
||||||
|
float viewz = rotatedz[p1]/(256/4) - (-170*4) as float ; from camera z to point z
|
||||||
|
|
||||||
|
; Calculate dot product of normal and view vector
|
||||||
|
; If dot product is negative, the face is pointing away from the camera
|
||||||
|
return normalx * viewx + normaly * viewy + normalz * viewz < 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shipdata {
|
shipdata {
|
||||||
|
|||||||
@@ -1,23 +1,26 @@
|
|||||||
%import textio
|
%import math
|
||||||
%import strings
|
%import textio
|
||||||
%zeropage basicsafe
|
|
||||||
|
|
||||||
|
|
||||||
main {
|
main {
|
||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
str n1 = "the quick brown fox"
|
|
||||||
|
|
||||||
txt.print(n1)
|
ubyte @shared st = 2
|
||||||
txt.nl()
|
|
||||||
txt.print_ub(len(n1))
|
on st goto (lblA, lblB, lblC, lblD)
|
||||||
txt.nl()
|
lblA:
|
||||||
n1[7]=0
|
txt.print("path a\n")
|
||||||
txt.print_ub(strings.length(n1))
|
goto lblDone
|
||||||
txt.nl()
|
lblB:
|
||||||
txt.print_ub(sizeof(n1))
|
txt.print("path b\n")
|
||||||
txt.nl()
|
goto 2 goto
|
||||||
txt.print_ub(sizeof("zzzz"))
|
lblC:
|
||||||
txt.nl()
|
txt.print("path c\n")
|
||||||
|
goto lblDone
|
||||||
|
lblD:
|
||||||
|
txt.print("path d\n")
|
||||||
|
|
||||||
|
lblDone:
|
||||||
|
txt.print("done\n")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user