@@ -372,3 +372,59 @@ final class RetouchesTests: XCTestCase {
372372 XCTAssertEqual ( r. first? . licence, " Public domain " )
373373 }
374374}
375+
376+ /// L'IA change n'importe quel réglage par son chemin (demande 6).
377+ final class CheminsTests : XCTestCase {
378+ func testEcrireEtLire( ) throws {
379+ var d = Design ( )
380+ try Chemins . ecrire ( " variante.palette.fond " , " #112233 " , dans: & d)
381+ XCTAssertEqual ( d. variante. palette. fond, " #112233 " )
382+ try Chemins . ecrire ( " echelles.titre " , " 1,3 " , dans: & d)
383+ XCTAssertEqual ( d. echelle ( " titre " ) , 1.3 , accuracy: 1e-9 )
384+ try Chemins . ecrire ( " ajustements.recto-titre.dx " , " 4 " , dans: & d)
385+ XCTAssertEqual ( d. ajustement ( " recto-titre " ) . dx, 4 )
386+ XCTAssertEqual ( d. ajustement ( " recto-titre " ) . echelle, 1 )
387+ try Chemins . ecrire ( " ajustements.etiquette-pochette.masque " , " oui " , dans: & d)
388+ XCTAssertTrue ( d. ajustement ( " etiquette-pochette " ) . masque)
389+ try Chemins . ecrire ( " etiquettePochette " , " aucune " , dans: & d)
390+ XCTAssertEqual ( d. etiquettePochette, . aucune)
391+ try Chemins . ecrire ( " codeBarres " , " non " , dans: & d)
392+ XCTAssertFalse ( d. codeBarres)
393+ try Chemins . ecrire ( " volets " , " 5 " , dans: & d)
394+ XCTAssertEqual ( d. volets, 5 )
395+ XCTAssertEqual ( Chemins . lire ( " volets " , dans: d) , " 5 " )
396+ XCTAssertEqual ( Chemins . lire ( " variante.palette.fond " , dans: d) , " #112233 " )
397+ }
398+
399+ func testRefus( ) {
400+ var d = Design ( )
401+ XCTAssertThrowsError ( try Chemins . ecrire ( " etiquettePochette " , " ronde " , dans: & d) )
402+ XCTAssertThrowsError ( try Chemins . ecrire ( " volets " , " 4.5 " , dans: & d) )
403+ XCTAssertThrowsError ( try Chemins . ecrire ( " codeBarres " , " peut-être " , dans: & d) )
404+ XCTAssertEqual ( d, Design ( ) , " un refus ne change rien " )
405+ }
406+
407+ func testProjetEtReglages( ) throws {
408+ var p = Projet ( numeroCatalogue: " LFS-009 " )
409+ try Chemins . ecrire ( " cassette.bande " , " typeI " , dans: & p)
410+ XCTAssertEqual ( p. cassette. bande, . typeI)
411+ try Chemins . ecrire ( " titre " , " Pluie " , dans: & p)
412+ XCTAssertEqual ( p. titre, " Pluie " )
413+ var r = Preferences ( )
414+ try Chemins . ecrire ( " platine.blanc " , " 3 " , dans: & r)
415+ XCTAssertEqual ( r. platine. blanc, 3 )
416+ // Les anciennes cassettes sans historique IA se relisent.
417+ XCTAssertTrue ( p. echangesIA. isEmpty)
418+ p. echangesIA = [ EchangeIA ( demande: " titre plus gros " , moteur: " Claude · claude-opus-5-5 " , reponse: " ok " ,
419+ changements: [ " echelles.titre : — → 1.3 " ] , cout: 0.01 , designApres: Design ( ) , refaisable: true ) ]
420+ let relu = try JSONDecoder ( ) . decode ( Projet . self, from: JSONEncoder ( ) . encode ( p) )
421+ XCTAssertEqual ( relu. echangesIA. first? . demande, " titre plus gros " )
422+ }
423+
424+ func testCout( ) {
425+ let c = CompteurJetons ( )
426+ c. ajouter ( entree: 1_000_000 , sortie: 100_000 )
427+ XCTAssertEqual ( c. cout ( modele: " claude-opus-5-5 " ) ?? 0 , 4 + 2 , accuracy: 1e-9 )
428+ XCTAssertNil ( c. cout ( modele: " modele-inconnu " ) )
429+ }
430+ }
0 commit comments