@@ -2374,7 +2374,7 @@ test.describe("MIDI Studio V2", () => {
23742374 await expect ( page . locator ( "#exportWorkflowContent" ) ) . toBeVisible ( ) ;
23752375 await expect ( page . locator ( "#renderedTargetsContent" ) ) . toBeVisible ( ) ;
23762376 await expect ( page . locator ( "#renderedExportTargetTypeSelect option" ) ) . toContainText ( [ "WAV" , "MP3" , "OGG" ] ) ;
2377- await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save/Export " ) ;
2377+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save WAV " ) ;
23782378 await expect ( page . locator ( "#renderedExportTargetTypeSelect" ) ) . toHaveAttribute ( "data-midi-studio-unwired" , "not-implemented" ) ;
23792379 await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveAttribute ( "data-midi-studio-unwired" , "not-implemented" ) ;
23802380 await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveAttribute ( "title" , / N o t i m p l e m e n t e d : R e n d e r e d a u d i o e x p o r t g e n e r a t i o n i s n o t i m p l e m e n t e d y e t / ) ;
@@ -2478,7 +2478,7 @@ test.describe("MIDI Studio V2", () => {
24782478 await expect ( page . locator ( "#futureExportOptionsSection" ) ) . toContainText ( "Future Rendering Options" ) ;
24792479 await expect ( page . locator ( "#exportStatusSection" ) ) . toContainText ( "Export Status" ) ;
24802480 await expect ( page . locator ( "#renderedExportTargetTypeSelect option" ) ) . toContainText ( [ "WAV" , "MP3" , "OGG" ] ) ;
2481- await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save/Export " ) ;
2481+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save WAV " ) ;
24822482 const exportControlOwners = await page . locator ( "#renderedExportTargetTypeSelect, #renderedExportSaveButton" ) . evaluateAll ( ( controls ) => controls . map ( ( control ) => control . closest ( "[data-midi-studio-tab-panel]" ) ?. dataset . midiStudioTabPanel ) ) ;
24832483 expect ( exportControlOwners ) . toEqual ( [ "export" , "export" ] ) ;
24842484
@@ -2527,6 +2527,7 @@ test.describe("MIDI Studio V2", () => {
25272527 ] ) ) ;
25282528
25292529 await page . locator ( "#renderedExportTargetTypeSelect" ) . selectOption ( "mp3" ) ;
2530+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save MP3" ) ;
25302531 await page . locator ( "#renderedExportSaveButton" ) . click ( ) ;
25312532 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / W A R N E x p o r t r e n d e r i n g n o t i m p l e m e n t e d f o r M P 3 \. P l a n n e d t a r g e t : a s s e t s \/ m u s i c \/ r e n d e r e d \/ c u s t o m - m a i n \. m p 3 \. / ) ;
25322533 await expect ( page . locator ( "#statusLog" ) ) . not . toHaveValue ( / c r e a t e d .* c u s t o m - m a i n \. m p 3 | w r o t e .* c u s t o m - m a i n \. m p 3 | s a v e d .* c u s t o m - m a i n \. m p 3 / i) ;
@@ -2566,6 +2567,59 @@ test.describe("MIDI Studio V2", () => {
25662567 }
25672568 } ) ;
25682569
2570+ test ( "keeps JSON wording and Song Setup editing history placeholders honest" , async ( { page } ) => {
2571+ const server = await openMidiStudioForImport ( page ) ;
2572+ try {
2573+ await expect ( page . locator ( "#toolImportManifestButton" ) ) . toHaveText ( "Import JSON Manifest" ) ;
2574+ await page . locator ( "#toolImportManifestInput" ) . setInputFiles ( uatManifestPath ) ;
2575+
2576+ await selectMidiStudioTab ( page , "export" ) ;
2577+ await expect ( page . locator ( "#toolExportToolStateButton" ) ) . toHaveText ( "Export JSON" ) ;
2578+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save WAV" ) ;
2579+ await page . locator ( "#renderedExportTargetTypeSelect" ) . selectOption ( "mp3" ) ;
2580+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save MP3" ) ;
2581+ await page . locator ( "#renderedExportTargetTypeSelect" ) . selectOption ( "ogg" ) ;
2582+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save OGG" ) ;
2583+ await expect ( page . locator ( "body" ) ) . not . toContainText ( / \b E x p o r t W A V \b | \b E x p o r t M P 3 \b | \b E x p o r t O G G \b / ) ;
2584+
2585+ await selectMidiStudioTab ( page , "song-setup" ) ;
2586+ await expect ( page . locator ( "#editingHistoryContent" ) ) . toBeVisible ( ) ;
2587+ await expect ( page . locator ( '[data-midi-studio-tab-panel="song-setup"] #editingHistoryContent' ) ) . toHaveCount ( 1 ) ;
2588+ await expect ( page . locator ( '[data-midi-studio-tab-panel="export"] #editingHistoryContent, [data-midi-studio-tab-panel="diagnostics"] #editingHistoryContent, [data-midi-studio-tab-panel="instruments"] #editingHistoryContent, [data-midi-studio-tab-panel="midi-import"] #editingHistoryContent' ) ) . toHaveCount ( 0 ) ;
2589+ const songBeforeHistoryClicks = await page . evaluate ( ( ) => JSON . stringify ( window . __midiStudioV2App . selectedSong ( ) ) ) ;
2590+ const historyControls = await page . locator ( "#editingHistoryContent [data-midi-studio-future-control]" ) . evaluateAll ( ( controls ) => controls . map ( ( control ) => ( {
2591+ disabled : control . disabled ,
2592+ status : control . dataset . midiStudioUnwired ,
2593+ text : control . textContent . trim ( ) ,
2594+ title : control . title
2595+ } ) ) ) ;
2596+ expect ( historyControls ) . toEqual ( [
2597+ expect . objectContaining ( { disabled : true , status : "not-implemented" , text : "Undo" } ) ,
2598+ expect . objectContaining ( { disabled : true , status : "not-implemented" , text : "Redo" } ) ,
2599+ expect . objectContaining ( { disabled : true , status : "not-implemented" , text : "Snapshots" } ) ,
2600+ expect . objectContaining ( { disabled : true , status : "not-implemented" , text : "Revision History" } ) ,
2601+ expect . objectContaining ( { disabled : true , status : "not-implemented" , text : "Revert To Saved" } ) ,
2602+ expect . objectContaining ( { disabled : true , status : "not-implemented" , text : "Autosave" } )
2603+ ] ) ;
2604+ expect ( historyControls . every ( ( control ) => control . title . includes ( "Not implemented:" ) ) ) . toBe ( true ) ;
2605+ await page . locator ( "#editingHistoryContent [data-midi-studio-future-control]" ) . evaluateAll ( ( controls ) => {
2606+ controls . forEach ( ( control ) => control . dispatchEvent ( new MouseEvent ( "click" , { bubbles : true } ) ) ) ;
2607+ } ) ;
2608+ expect ( await page . evaluate ( ( ) => JSON . stringify ( window . __midiStudioV2App . selectedSong ( ) ) ) ) . toBe ( songBeforeHistoryClicks ) ;
2609+
2610+ await selectMidiStudioTab ( page , "studio" ) ;
2611+ await page . locator ( "#playButton" ) . click ( ) ;
2612+ await expect ( page . locator ( "#playButton" ) ) . toBeDisabled ( ) ;
2613+ await expect ( page . locator ( "#stopButton" ) ) . toBeEnabled ( ) ;
2614+ await page . locator ( "#stopButton" ) . click ( ) ;
2615+ await expect ( page . locator ( "#stopButton" ) ) . toBeDisabled ( ) ;
2616+ await expect ( page . locator ( "#playButton" ) ) . toBeEnabled ( ) ;
2617+ } finally {
2618+ await workspaceV2CoverageReporter . stop ( page ) ;
2619+ await server . close ( ) ;
2620+ }
2621+ } ) ;
2622+
25692623 test ( "derives primary song, instrument, grid, playback, and diagnostics views from the canonical selected song" , async ( { page } ) => {
25702624 const server = await openMidiStudioForImport ( page ) ;
25712625 try {
@@ -2726,7 +2780,7 @@ test.describe("MIDI Studio V2", () => {
27262780 await expect ( page . locator ( 'label[for="renderedExportTargetTypeSelect"]' ) ) . toContainText ( "Output Type" ) ;
27272781 await expect ( page . locator ( "#renderedExportTargetTypeSelect" ) ) . toBeVisible ( ) ;
27282782 await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toBeVisible ( ) ;
2729- await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save/Export " ) ;
2783+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save WAV " ) ;
27302784 await selectMidiStudioTab ( page , "song-setup" ) ;
27312785 const navAndTabPresentation = await page . evaluate ( ( ) => {
27322786 const readActionButton = ( selector ) => {
@@ -2920,7 +2974,7 @@ test.describe("MIDI Studio V2", () => {
29202974 }
29212975 } ) ;
29222976
2923- test ( "exports output through Export tab Type dropdown and Save/Export without claiming project save" , async ( { page } ) => {
2977+ test ( "saves output through Export tab Type dropdown without claiming project save" , async ( { page } ) => {
29242978 const server = await openMidiStudio ( page ) ;
29252979 try {
29262980 await expect ( page . locator ( "#exportWavButton" ) ) . toHaveCount ( 0 ) ;
@@ -2932,7 +2986,7 @@ test.describe("MIDI Studio V2", () => {
29322986 await expect ( page . locator ( "#renderedExportTargetTypeSelect" ) ) . toBeVisible ( ) ;
29332987 await expect ( page . locator ( "#renderedExportTargetTypeSelect option" ) ) . toContainText ( [ "WAV" , "MP3" , "OGG" ] ) ;
29342988 await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toBeVisible ( ) ;
2935- await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save/Export " ) ;
2989+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save WAV " ) ;
29362990 const exportControlsFit = await page . locator ( "#exportWorkflowContent" ) . evaluate ( ( panel ) => {
29372991 const label = panel . querySelector ( 'label[for="renderedExportTargetTypeSelect"]' ) . getBoundingClientRect ( ) ;
29382992 const typeSelect = panel . querySelector ( "#renderedExportTargetTypeSelect" ) . getBoundingClientRect ( ) ;
@@ -2946,10 +3000,13 @@ test.describe("MIDI Studio V2", () => {
29463000 expect ( exportControlsFit . fit ) . toBe ( true ) ;
29473001 expect ( exportControlsFit . sameRow ) . toBe ( true ) ;
29483002 await page . locator ( "#renderedExportTargetTypeSelect" ) . selectOption ( "wav" ) ;
3003+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save WAV" ) ;
29493004 await page . locator ( "#renderedExportSaveButton" ) . click ( ) ;
29503005 await page . locator ( "#renderedExportTargetTypeSelect" ) . selectOption ( "mp3" ) ;
3006+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save MP3" ) ;
29513007 await page . locator ( "#renderedExportSaveButton" ) . click ( ) ;
29523008 await page . locator ( "#renderedExportTargetTypeSelect" ) . selectOption ( "ogg" ) ;
3009+ await expect ( page . locator ( "#renderedExportSaveButton" ) ) . toHaveText ( "Save OGG" ) ;
29533010 await page . locator ( "#renderedExportSaveButton" ) . click ( ) ;
29543011 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / W A R N E x p o r t r e n d e r i n g n o t i m p l e m e n t e d f o r W A V \. P l a n n e d t a r g e t : a s s e t s \/ m u s i c \/ r e n d e r e d \/ t h e m e - m a i n \. w a v \. / ) ;
29553012 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / W A R N E x p o r t r e n d e r i n g n o t i m p l e m e n t e d f o r M P 3 \. P l a n n e d t a r g e t : a s s e t s \/ m u s i c \/ r e n d e r e d \/ t h e m e - m a i n \. m p 3 \. / ) ;
@@ -2980,7 +3037,7 @@ test.describe("MIDI Studio V2", () => {
29803037 await expect ( outputTypeSelect ) . toHaveAttribute ( "data-midi-studio-unwired" , "not-implemented" ) ;
29813038 await expect ( saveOutputButton ) . toHaveAttribute ( "data-midi-studio-unwired" , "not-implemented" ) ;
29823039 await expect ( saveOutputButton ) . toHaveAttribute ( "title" , / N o t i m p l e m e n t e d : R e n d e r e d a u d i o e x p o r t g e n e r a t i o n i s n o t i m p l e m e n t e d y e t / ) ;
2983- await expect ( saveOutputButton ) . toHaveAttribute ( "aria-label" , / S a v e \/ E x p o r t \( N o t i m p l e m e n t e d \) / ) ;
3040+ await expect ( saveOutputButton ) . toHaveAttribute ( "aria-label" , / S a v e W A V \( N o t i m p l e m e n t e d \) / ) ;
29843041 await expect ( outputTypeSelect ) . toHaveAttribute ( "title" , / N o t i m p l e m e n t e d : R e n d e r e d a u d i o e x p o r t g e n e r a t i o n i s n o t i m p l e m e n t e d y e t / ) ;
29853042 expect ( await controlColors ( page , "#renderedExportSaveButton" ) ) . toMatchObject ( {
29863043 borderTopColor : "rgb(248, 113, 113)" ,
0 commit comments