Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import com.codebutler.farebot.test.CardTestHelper.standardFile
import com.codebutler.farebot.transit.TransitCurrency
import com.codebutler.farebot.transit.Trip
import com.codebutler.farebot.transit.clipper.ClipperTransitFactory
import com.codebutler.farebot.transit.clipper.ClipperTransitInfo
import com.codebutler.farebot.transit.clipper.ClipperTrip
import kotlinx.coroutines.test.runTest
import kotlin.math.abs
Expand Down Expand Up @@ -195,7 +194,7 @@ class ClipperTransitTest {
agency = 0x04,
fareValue = 350,
)
val fareStr = trip.fare?.formatCurrencyString() ?: ""
val fareStr = trip.fare.formatCurrencyString()
// Should format as USD
assertTrue(
fareStr.contains("3.50") || fareStr.contains("3,50"),
Expand Down Expand Up @@ -229,7 +228,6 @@ class ClipperTransitTest {
assertEquals("572691763", identity.serialNumber)

val info = factory.parseInfo(card)
assertTrue(info is ClipperTransitInfo, "TransitData must be instance of ClipperTransitInfo")

assertEquals("572691763", info.serialNumber)
assertEquals("Clipper", info.cardName.resolveAsync())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,6 @@ class CompassTransitTest {

// Test transit info parsing
val info = factory.parseInfo(card)
assertNotNull(info, "Transit info should not be null")
assertTrue(info is CompassUltralightTransitInfo, "Info should be CompassUltralightTransitInfo")
assertEquals(cardData[0], info.serialNumber, "Serial number should match")

// Test identity parsing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,8 @@ import com.codebutler.farebot.shared.serialize.FlipperNfcParser
import com.codebutler.farebot.transit.TransitCurrency
import com.codebutler.farebot.transit.Trip
import com.codebutler.farebot.transit.clipper.ClipperTransitFactory
import com.codebutler.farebot.transit.clipper.ClipperTransitInfo
import com.codebutler.farebot.transit.orca.OrcaTransitFactory
import com.codebutler.farebot.transit.orca.OrcaTransitInfo
import com.codebutler.farebot.transit.suica.SuicaTransitFactory
import com.codebutler.farebot.transit.suica.SuicaTransitInfo
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertEquals
Expand Down Expand Up @@ -74,8 +71,6 @@ class FlipperIntegrationTest {
assertEquals("10043012", identity.serialNumber)

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse ORCA transit info")
assertTrue(info is OrcaTransitInfo)

// Balance: $26.25 USD
val balances = info.balances
Expand Down Expand Up @@ -111,8 +106,6 @@ class FlipperIntegrationTest {
assertEquals("1205019883", identity.serialNumber)

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse Clipper transit info")
assertTrue(info is ClipperTransitInfo)

// Balance: $2.25 USD
val balances = info.balances
Expand Down Expand Up @@ -288,8 +281,6 @@ class FlipperIntegrationTest {
assertNull(identity.serialNumber)

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse Suica transit info")
assertTrue(info is SuicaTransitInfo)

// Balance: 870 JPY
val balances = info.balances
Expand Down Expand Up @@ -527,9 +518,6 @@ class FlipperIntegrationTest {
assertNull(identity.serialNumber)

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse PASMO transit info")
assertTrue(info is SuicaTransitInfo)

// Balance: 500 JPY
val balances = info.balances
assertNotNull(balances)
Expand Down Expand Up @@ -674,8 +662,6 @@ class FlipperIntegrationTest {
assertNull(identity.serialNumber)

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse ICOCA transit info")
assertTrue(info is SuicaTransitInfo)

// Balance: 827 JPY
val balances = info.balances
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,10 @@ import com.codebutler.farebot.card.classic.ClassicCard
import com.codebutler.farebot.card.classic.raw.RawClassicBlock
import com.codebutler.farebot.card.classic.raw.RawClassicCard
import com.codebutler.farebot.card.classic.raw.RawClassicSector
import com.codebutler.farebot.card.ultralight.UltralightCard
import com.codebutler.farebot.card.ultralight.UltralightPage
import com.codebutler.farebot.card.ultralight.raw.RawUltralightCard
import com.codebutler.farebot.transit.TransitCurrency
import com.codebutler.farebot.transit.troika.TroikaTransitFactory
import com.codebutler.farebot.transit.troika.TroikaTransitInfo
import com.codebutler.farebot.transit.ventra.VentraUltralightTransitInfo
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
Expand Down Expand Up @@ -93,7 +91,6 @@ class MetrodroidDumpIntegrationTest {
)

val card = rawCard.parse()
assertTrue(card is UltralightCard, "Expected UltralightCard")

val factory = VentraUltralightTransitInfo.FACTORY
assertTrue(factory.check(card), "Ventra factory should recognize this card")
Expand All @@ -103,8 +100,6 @@ class MetrodroidDumpIntegrationTest {
assertNotNull(identity.serialNumber, "Should have a serial number")

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse Ventra transit info")
assertTrue(info is VentraUltralightTransitInfo)

// Balance: $8.44 USD (844 cents)
val balances = info.balances
Expand Down Expand Up @@ -141,8 +136,6 @@ class MetrodroidDumpIntegrationTest {
assertNotNull(identity.serialNumber, "Should have serial number")

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse Troika transit info")
assertTrue(info is TroikaTransitInfo)

// Balance: 0.00 RUB (0 kopeks)
val balances = info.balances
Expand Down Expand Up @@ -174,8 +167,6 @@ class MetrodroidDumpIntegrationTest {
assertNotNull(identity.serialNumber, "Should have serial number")

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse Troika transit info")
assertTrue(info is TroikaTransitInfo)

// Balance: 50.00 RUB (5000 kopeks)
val balances = info.balances
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ class MykiTransitTest {

// Test TransitData
val info = factory.parseInfo(card)
assertTrue(info is MykiTransitInfo, "TransitData must be instance of MykiTransitInfo")
assertEquals("308425123456780", info.serialNumber)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,9 @@ import com.codebutler.farebot.card.classic.ClassicCard
import com.codebutler.farebot.card.classic.DataClassicSector
import com.codebutler.farebot.test.CardTestHelper.hexToBytes
import com.codebutler.farebot.transit.laxtap.LaxTapTransitFactory
import com.codebutler.farebot.transit.laxtap.LaxTapTransitInfo
import com.codebutler.farebot.transit.mspgoto.MspGotoTransitFactory
import com.codebutler.farebot.transit.mspgoto.MspGotoTransitInfo
import com.codebutler.farebot.transit.nextfare.NextfareTransitInfo
import com.codebutler.farebot.transit.seqgo.SeqGoTransitFactory
import com.codebutler.farebot.transit.seqgo.SeqGoTransitInfo
import kotlinx.datetime.TimeZone
import kotlin.test.Test
import kotlin.test.assertEquals
Expand Down Expand Up @@ -175,7 +172,6 @@ class NextfareTransitTest {
val seqGoFactory = SeqGoTransitFactory()
assertTrue(seqGoFactory.check(c1), "Card is seqgo")
val d1 = seqGoFactory.parseInfo(c1)
assertTrue(d1 is SeqGoTransitInfo, "Card is SeqGoTransitInfo")
assertEquals("0160 0012 3456 7893", d1.serialNumber)
val balances1 = d1.balances
assertNotNull(balances1)
Expand All @@ -190,7 +186,6 @@ class NextfareTransitTest {
)
assertTrue(seqGoFactory.check(c2), "Card is seqgo")
val d2 = seqGoFactory.parseInfo(c2)
assertTrue(d2 is SeqGoTransitInfo, "Card is SeqGoTransitInfo")
assertEquals("0160 0098 7654 3213", d2.serialNumber)
val balances2 = d2.balances
assertNotNull(balances2)
Expand All @@ -211,7 +206,6 @@ class NextfareTransitTest {
val laxTapFactory = LaxTapTransitFactory()
assertTrue(laxTapFactory.check(c), "Card is laxtap")
val d = laxTapFactory.parseInfo(c)
assertTrue(d is LaxTapTransitInfo, "Card is LaxTapTransitInfo")
assertEquals("0160 0323 4663 8769", d.serialNumber)
val balances = d.balances
assertNotNull(balances)
Expand All @@ -231,7 +225,6 @@ class NextfareTransitTest {
val mspGotoFactory = MspGotoTransitFactory()
assertTrue(mspGotoFactory.check(c), "Card is mspgoto")
val d = mspGotoFactory.parseInfo(c)
assertTrue(d is MspGotoTransitInfo, "Card is MspGotoTransitInfo")
assertEquals("0160 0112 3581 3212", d.serialNumber)
val balances = d.balances
assertNotNull(balances)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ class OctopusTransitTest {

// Test TransitData
val info = factory.parseInfo(card)
assertTrue(info is OctopusTransitInfo, "TransitData must be instance of OctopusTransitInfo")

assertNotNull(info.balances)
assertTrue(info.balances!!.isNotEmpty())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@ class OpalTransitTest {

// Test TransitInfo
val info = factory.parseInfo(card)
assertTrue(info is OpalTransitInfo, "TransitData must be instance of OpalTransitInfo")

assertEquals("3085 2200 1234 5670", info.serialNumber)
assertEquals(TransitCurrency.AUD(336), info.balances?.first()?.balance)
Expand Down Expand Up @@ -191,7 +190,7 @@ class OpalTransitTest {
// 2018-03-31 09:00 AEDT (UTC+11)
// = 2018-03-30 22:00 UTC
var card = createOpalCard(hexToBytes("85D25E07230520A70044DA380419FFFF"))
var info = factory.parseInfo(card) as OpalTransitInfo
var info = factory.parseInfo(card)
var expectedTime = Instant.parse("2018-03-30T22:00:00Z")
assertEquals(
expectedTime,
Expand All @@ -204,7 +203,7 @@ class OpalTransitTest {
// 2018-04-01 09:00 AEST (UTC+10)
// = 2018-03-31 23:00 UTC
card = createOpalCard(hexToBytes("85D25E07430520A70048DA380419FFFF"))
info = factory.parseInfo(card) as OpalTransitInfo
info = factory.parseInfo(card)
expectedTime = Instant.parse("2018-03-31T23:00:00Z")
assertEquals(
expectedTime,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import com.codebutler.farebot.test.CardTestHelper.standardFile
import com.codebutler.farebot.transit.TransitCurrency
import com.codebutler.farebot.transit.Trip
import com.codebutler.farebot.transit.orca.OrcaTransitFactory
import com.codebutler.farebot.transit.orca.OrcaTransitInfo
import kotlinx.coroutines.test.runTest
import kotlin.math.abs
import kotlin.test.Test
Expand Down Expand Up @@ -94,7 +93,6 @@ class OrcaTransitTest {

// Test TransitInfo
val info = factory.parseInfo(card)
assertTrue(info is OrcaTransitInfo, "TransitData must be instance of OrcaTransitInfo")
assertEquals("12030625", info.serialNumber)
assertEquals("ORCA", info.cardName.resolveAsync())
assertEquals(TransitCurrency.USD(23432), info.balances?.firstOrNull()?.balance)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import com.codebutler.farebot.transit.bilheteunico.BilheteUnicoSPTransitFactory
import com.codebutler.farebot.transit.bilheteunico.BilheteUnicoSPTransitInfo
import com.codebutler.farebot.transit.calypso.mobib.MobibTransitInfo
import com.codebutler.farebot.transit.easycard.EasyCardTransitFactory
import com.codebutler.farebot.transit.easycard.EasyCardTransitInfo
import com.codebutler.farebot.transit.ezlink.EZLinkTransitFactory
import com.codebutler.farebot.transit.ezlink.EZLinkTransitInfo
import com.codebutler.farebot.transit.hsl.HSLTransitFactory
Expand All @@ -58,7 +57,6 @@ import com.codebutler.farebot.transit.seqgo.SeqGoTransitFactory
import com.codebutler.farebot.transit.seqgo.SeqGoTransitInfo
import com.codebutler.farebot.transit.serialonly.HoloTransitFactory
import com.codebutler.farebot.transit.serialonly.HoloTransitInfo
import com.codebutler.farebot.transit.serialonly.SerialOnlyTransitInfo
import com.codebutler.farebot.transit.serialonly.TrimetHopTransitFactory
import com.codebutler.farebot.transit.serialonly.TrimetHopTransitInfo
import com.codebutler.farebot.transit.tmoney.TMoneyTransitFactory
Expand Down Expand Up @@ -320,7 +318,6 @@ class SampleDumpIntegrationTest : CardDumpTest() {
assertNotNull(identity.serialNumber)

// Serial-only card: no balance, no trips, but has emptyStateMessage
assertTrue(info is SerialOnlyTransitInfo)
assertNotNull(info.emptyStateMessage, "Serial-only card should have an emptyStateMessage")
assertNull(info.trips, "Serial-only card should have null trips")
assertTrue(info.balances.isNullOrEmpty(), "Serial-only card should have no balances")
Expand Down Expand Up @@ -377,7 +374,7 @@ class SampleDumpIntegrationTest : CardDumpTest() {
val result = importer.importMfcDump(bytes)
assertTrue(result is ImportResult.Success, "Failed to import MFC dump: $result")

val rawCard = (result as ImportResult.Success).cards.first()
val rawCard = result.cards.first()
val card = rawCard.parse() as ClassicCard

val factory = EasyCardTransitFactory()
Expand All @@ -387,8 +384,6 @@ class SampleDumpIntegrationTest : CardDumpTest() {
assertNotNull(identity.name)

val info = factory.parseInfo(card)
assertNotNull(info, "Failed to parse EasyCard transit info")
assertTrue(info is EasyCardTransitInfo)

// Balance: 245 TWD
val balances = info.balances
Expand Down Expand Up @@ -518,7 +513,6 @@ class SampleDumpIntegrationTest : CardDumpTest() {
assertEquals("308425123456780", identity.serialNumber)

// Serial-only card: has emptyStateMessage, no trips
assertTrue(info is SerialOnlyTransitInfo)
assertNotNull(info.emptyStateMessage, "Serial-only card should have an emptyStateMessage")
assertNull(info.trips, "Serial-only card should have null trips")
}
Expand Down Expand Up @@ -567,11 +561,9 @@ class SampleDumpIntegrationTest : CardDumpTest() {
assertEquals("Hop Fastpass", identity.name.resolveAsync())
assertEquals("01-001-12345678-RA", identity.serialNumber)

assertTrue(info is TrimetHopTransitInfo)
assertEquals("01-001-12345678-RA", info.serialNumber)

// Serial-only card: has emptyStateMessage, no trips
assertTrue(info is SerialOnlyTransitInfo)
assertNotNull(info.emptyStateMessage, "Serial-only card should have an emptyStateMessage")
assertNull(info.trips, "Serial-only card should have null trips")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ object TestAssetLoader {
val importer = CardImporter.create(KotlinxCardSerializer(json))
val result = importer.importCards(jsonString)
assertTrue(result is ImportResult.Success, "Failed to import card from $resourcePath: $result")
return (result as ImportResult.Success).cards.first()
return result.cards.first()
}

/**
Expand Down Expand Up @@ -247,8 +247,6 @@ abstract class CardDumpTest {
val card = rawCard.parse()
assertTrue(factory.check(card), "Card did not match factory: ${factory::class.simpleName}")
val transitInfo = factory.parseInfo(card)
assertNotNull(transitInfo, "Failed to parse transit info")
assertTrue(transitInfo is T, "Transit info is not of expected type")
return transitInfo
}

Expand All @@ -273,8 +271,6 @@ abstract class CardDumpTest {
val card = rawCard.parse() as C
assertTrue(factory.check(card), "Card did not match factory: ${factory::class.simpleName}")
val transitInfo = factory.parseInfo(card)
assertNotNull(transitInfo, "Failed to parse transit info")
assertTrue(transitInfo is T, "Transit info is not of expected type")
return transitInfo
}

Expand All @@ -291,8 +287,6 @@ abstract class CardDumpTest {
val card = rawCard.parse() as C
assertTrue(factory.check(card), "Card did not match factory: ${factory::class.simpleName}")
val transitInfo = factory.parseInfo(card)
assertNotNull(transitInfo, "Failed to parse transit info")
assertTrue(transitInfo is T, "Transit info is not of expected type")
return Pair(card, transitInfo)
}
}
2 changes: 2 additions & 0 deletions app/web/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
@file:OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class)

plugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.compose.multiplatform)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ object DesfireCardReader {
val fileData = readFileData(desfireProtocol, fileId, fileSettings)
RawDesfireFile.create(fileId, fileSettings, fileData)
} catch (ex: UnauthorizedException) {
RawDesfireFile.createUnauthorized(fileId, fileSettings, ex.message ?: "Access denied")
RawDesfireFile.createUnauthorized(fileId, fileSettings, ex.message)
} catch (ex: Exception) {
RawDesfireFile.createInvalid(fileId, fileSettings, ex.toString())
}
Expand Down Expand Up @@ -169,7 +169,7 @@ object DesfireCardReader {

// All commands failed
return if (lastException is UnauthorizedException) {
RawDesfireFile.createUnauthorized(fileId, null, lastException.message ?: "Access denied")
RawDesfireFile.createUnauthorized(fileId, null, lastException.message)
} else {
RawDesfireFile.createInvalid(fileId, null, lastException.toString())
}
Expand Down
Loading