Trois causes opposées disaient la même chose : le premier essai BLE n'a rien appris
Sylvain a lancé l'envoi Bluetooth et obtenu « aucune montre Polar exposant PsFTP ». Ce message ne permet pas de conclure : il couvre à la fois « aucun appareil vu » (Bluetooth éteint, autorisation refusée à l'app, montre hors de portée) et « la montre est là mais ne répond pas » (canal déjà pris par Polar Flow). Ce sont des causes opposées et des gestes différents. Un essai qui n'apprend rien est un essai perdu, et celui-là demandait de brancher une montre. L'erreur porte désormais ce qui a été observé — appareils vus, combien sans le service FEEE, combien avec mais muets — et rend trois messages distincts, chacun nommant le geste correspondant. Quatre tests verrouillent la distinction, dont celui qui interdit d'accuser Polar Flow quand rien n'a été vu : ce serait envoyer sur une fausse piste. Le scan devient aussi répétitif, par fenêtres de 4 s jusqu'au timeout, au lieu d'une passe unique de 10 s. CoreBluetooth peut n'être pas encore poweredOn au premier appel : le scan ne démarre alors jamais et une fenêtre unique conclut à tort qu'aucun appareil n'existe. C'est une cause plausible du premier échec, et elle n'était pas couverte. 73 tests au vert sur tests-linux. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -118,3 +118,41 @@ final class PolarPftpStepTests: XCTestCase {
|
||||
XCTAssertTrue(PftpStep(path: "/U/0/x.BPB", data: Data([1])).describe.hasPrefix("put"))
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Les trois causes d'échec ne doivent pas se confondre
|
||||
//
|
||||
// Au premier essai Bluetooth du 2026-08-31, un message unique disait « aucune
|
||||
// montre exposant PsFTP » — sans distinguer « rien vu du tout » (Bluetooth
|
||||
// éteint, permission refusée) de « la montre est là mais ne répond pas » (canal
|
||||
// occupé par Polar Flow). Ce sont des causes opposées et des gestes différents.
|
||||
|
||||
final class PolarPftpErrorTests: XCTestCase {
|
||||
|
||||
func testAucunAppareilVuPointeVersLIPhone() {
|
||||
let e = PolarPftpError.watchNotFound(30, vues: 0, sansPsFtp: 0, muettes: 0)
|
||||
XCTAssertTrue(e.description.contains("autorisation Bluetooth"))
|
||||
XCTAssertFalse(e.description.contains("Polar Flow"),
|
||||
"sans aucun appareil vu, accuser Flow envoie sur une fausse piste")
|
||||
}
|
||||
|
||||
func testUneMontreMuettePointeVersFlow() {
|
||||
let e = PolarPftpError.watchNotFound(30, vues: 3, sansPsFtp: 2, muettes: 1)
|
||||
XCTAssertTrue(e.description.contains("Polar Flow"))
|
||||
XCTAssertTrue(e.description.contains("occupé"))
|
||||
}
|
||||
|
||||
func testDesAppareilsSansPsFtpNommentLInconnueRestante() {
|
||||
let e = PolarPftpError.watchNotFound(30, vues: 4, sansPsFtp: 4, muettes: 0)
|
||||
XCTAssertTrue(e.description.contains("n'expose PsFTP"))
|
||||
XCTAssertTrue(e.description.contains("4 appareil"))
|
||||
}
|
||||
|
||||
func testLesTroisMessagesSontDistincts() {
|
||||
let messages = Set([
|
||||
PolarPftpError.watchNotFound(30, vues: 0, sansPsFtp: 0, muettes: 0).description,
|
||||
PolarPftpError.watchNotFound(30, vues: 3, sansPsFtp: 2, muettes: 1).description,
|
||||
PolarPftpError.watchNotFound(30, vues: 4, sansPsFtp: 4, muettes: 0).description,
|
||||
])
|
||||
XCTAssertEqual(messages.count, 3)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user