package prog8tests.codegencpu6502 import prog8.code.core.* internal object DummyMemsizer : IMemSizer { override fun memorySize(dt: DataType, numElements: Int?): Int { if(dt.isArray) { require(numElements != null) return when(dt.sub?.dt) { BaseDataType.BOOL, BaseDataType.BYTE, BaseDataType.UBYTE -> numElements BaseDataType.UWORD, BaseDataType.WORD -> numElements*2 BaseDataType.FLOAT -> numElements*5 else -> throw IllegalArgumentException("invalid sub type") } } return when { dt.isByteOrBool -> 1 * (numElements ?: 1) dt.isFloat -> 5 * (numElements ?: 1) else -> 2 * (numElements ?: 1) } } override fun memorySize(dt: SubType): Int { return memorySize(DataType.forDt(dt.dt), null) } } internal object DummyStringEncoder : IStringEncoding { override val defaultEncoding: Encoding = Encoding.ISO override fun encodeString(str: String, encoding: Encoding): List { return emptyList() } override fun decodeString(bytes: Iterable, encoding: Encoding): String { return "" } } internal class ErrorReporterForTests(private val throwExceptionAtReportIfErrors: Boolean=true, private val keepMessagesAfterReporting: Boolean=false): IErrorReporter { val errors = mutableListOf() val warnings = mutableListOf() val infos = mutableListOf() override fun err(msg: String, position: Position) { val text = "${position.toClickableStr()} $msg" if(text !in errors) errors.add(text) } override fun warn(msg: String, position: Position) { val text = "${position.toClickableStr()} $msg" if(text !in warnings) warnings.add(text) } override fun info(msg: String, position: Position) { val text = "${position.toClickableStr()} $msg" if(text !in infos) infos.add(text) } override fun undefined(symbol: List, position: Position) { err("undefined symbol: ${symbol.joinToString(".")}", position) } override fun noErrors(): Boolean = errors.isEmpty() override fun noErrorForLine(position: Position) = !errors.any { ":${position.line}:" in it } override fun report() { infos.forEach { println("UNITTEST COMPILATION REPORT: INFO: $it") } warnings.forEach { println("UNITTEST COMPILATION REPORT: WARNING: $it") } errors.forEach { println("UNITTEST COMPILATION REPORT: ERROR: $it") } if(throwExceptionAtReportIfErrors) finalizeNumErrors(errors.size, warnings.size, infos.size) if(!keepMessagesAfterReporting) { clear() } } fun clear() { errors.clear() warnings.clear() infos.clear() } }