@@ -1190,15 +1190,18 @@ test.describe("Workspace Manager V2 bootstrap", () => {
11901190 await page . locator ( "#objectVectorStudioV2ObjectNameInput" ) . fill ( "Blocked Object" ) ;
11911191 await page . locator ( "#objectVectorStudioV2AddObjectButton" ) . click ( ) ;
11921192 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / F A I L A d d o b j e c t b l o c k e d : l o a d a s c h e m a - v a l i d p a l e t t e - b a c k e d p a y l o a d b e f o r e a d d i n g o b j e c t s \. / ) ;
1193- await expect ( page . locator ( ".object-vector-studio-v2__tool-toggle" ) ) . toHaveText ( [ "+ Select" , "Re Rectangle" , "El Ellipse" , "P Path " , "M Move " , "R Rotate " , "G Group " ] ) ;
1193+ await expect ( page . locator ( ".object-vector-studio-v2__tool-toggle" ) ) . toHaveText ( [ "+ Select" , "Re Rectangle" , "Ci Circle" , " El Ellipse", "Li Line " , "Po Polygon " , "Ar Arc " , "Tx Text " ] ) ;
11941194
1195- await page . locator ( '[data-shape-tool="path "]' ) . click ( ) ;
1196- await expect ( page . locator ( '[data-shape-tool="path "]' ) ) . toHaveAttribute ( "aria-pressed" , "true" ) ;
1197- await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K S h a p e \/ T o o l s s h e l l t o g g l e s e l e c t e d : p a t h / ) ;
1195+ await page . locator ( '[data-shape-tool="rectangle "]' ) . click ( ) ;
1196+ await expect ( page . locator ( '[data-shape-tool="rectangle "]' ) ) . toHaveAttribute ( "aria-pressed" , "true" ) ;
1197+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / F A I L C r e a t e r e c t a n g l e b l o c k e d : s e l e c t a s c h e m a - v a l i d o b j e c t f i r s t \. / ) ;
11981198 await page . locator ( "#objectVectorStudioV2ToolLabelModeButton" ) . click ( ) ;
1199- await expect ( page . locator ( "#objectVectorStudioV2ToolLabelModeButton" ) ) . toHaveText ( "Icons " ) ;
1199+ await expect ( page . locator ( "#objectVectorStudioV2ToolLabelModeButton" ) ) . toHaveText ( "Words " ) ;
12001200 await expect ( page . locator ( "#objectVectorStudioV2ToolToggleGrid" ) ) . toHaveClass ( / i s - i c o n - o n l y / ) ;
12011201 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K S h a p e \/ T o o l s d i s p l a y m o d e s e t t o c o m p a c t i c o n s \. / ) ;
1202+ await page . reload ( { waitUntil : "networkidle" } ) ;
1203+ await expect ( page . locator ( "#objectVectorStudioV2ToolToggleGrid" ) ) . toHaveClass ( / i s - i c o n - o n l y / ) ;
1204+ await expect ( page . locator ( "#objectVectorStudioV2ToolLabelModeButton" ) ) . toHaveText ( "Words" ) ;
12021205
12031206 const invalidPayloadPath = testInfo . outputPath ( "object-vector-invalid.json" ) ;
12041207 await writeFile ( invalidPayloadPath , JSON . stringify ( { objects : [ ] } , null , 2 ) , "utf8" ) ;
@@ -1207,6 +1210,38 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12071210 await expect ( page . locator ( "#objectVectorStudioV2ObjectTiles" ) ) . toContainText ( "No objects loaded" ) ;
12081211 await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toHaveText ( "{}" ) ;
12091212
1213+ const invalidShapePayloadPath = testInfo . outputPath ( "object-vector-invalid-shape.json" ) ;
1214+ await writeFile ( invalidShapePayloadPath , JSON . stringify ( {
1215+ palette : {
1216+ id : "arcade-primary" ,
1217+ swatches : [
1218+ { id : "white" , value : "#ffffff" }
1219+ ]
1220+ } ,
1221+ objects : [
1222+ {
1223+ id : "bad-object" ,
1224+ name : "Bad Object" ,
1225+ shapes : [
1226+ {
1227+ geometry : { } ,
1228+ id : "bad-shape" ,
1229+ locked : false ,
1230+ order : 1 ,
1231+ style : { fill : "#ffffff" , stroke : "#ffffff" , strokeWidth : 3 } ,
1232+ type : "triangle" ,
1233+ visible : true
1234+ }
1235+ ] ,
1236+ type : "object"
1237+ }
1238+ ]
1239+ } , null , 2 ) , "utf8" ) ;
1240+ await page . locator ( "#objectVectorStudioV2ImportJsonInput" ) . setInputFiles ( invalidShapePayloadPath ) ;
1241+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / F A I L O b j e c t V e c t o r S t u d i o V 2 s c h e m a v a l i d a t i o n f a i l e d f r o m i m p o r t : o b j e c t - v e c t o r - i n v a l i d - s h a p e \. j s o n : r o o t \. o b j e c t s \[ 0 \] \. s h a p e s \[ 0 \] \. t y p e m u s t b e o n e o f r e c t a n g l e , c i r c l e , e l l i p s e , l i n e , p o l y g o n , a r c , t e x t \. / ) ;
1242+ await expect ( page . locator ( "#objectVectorStudioV2ObjectTiles" ) ) . toContainText ( "No objects loaded" ) ;
1243+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toHaveText ( "{}" ) ;
1244+
12101245 const validPayload = {
12111246 palette : {
12121247 id : "arcade-primary" ,
@@ -1218,6 +1253,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12181253 objects : Array . from ( { length : 18 } , ( _ , index ) => ( {
12191254 id : `object-${ index + 1 } ` ,
12201255 name : index === 0 ? "Asteroids Ship" : `Object ${ index + 1 } ` ,
1256+ shapes : [ ] ,
12211257 type : index === 1 ? "enemy" : "ship"
12221258 } ) )
12231259 } ;
@@ -1232,10 +1268,43 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12321268 await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails" ) ) . toContainText ( "Ship entity metadata framework" ) ;
12331269 await expect ( page . locator ( "#objectVectorStudioV2SelectedItemVisibility" ) ) . toContainText ( "Selected item visible: Asteroids Ship" ) ;
12341270 await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"name": "Asteroids Ship"' ) ;
1271+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"selectedShape": null' ) ;
12351272 await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . not . toContainText ( '"palette"' ) ;
12361273 await expect ( page . locator ( "#objectVectorStudioV2CopyJsonButton" ) ) . toBeEnabled ( ) ;
12371274 await expect ( page . locator ( "#objectVectorStudioV2ExportJsonButton" ) ) . toBeEnabled ( ) ;
12381275 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K L o a d e d O b j e c t V e c t o r S t u d i o V 2 s c h e m a p a y l o a d f r o m i m p o r t : o b j e c t - v e c t o r - v a l i d \. j s o n : 1 8 o b j e c t s , 2 p a l e t t e s w a t c h e s \. / ) ;
1276+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K R e n d e r m o d e s v g - w o r k - s u r f a c e : r e n d e r e d A s t e r o i d s S h i p w i t h 0 v i s i b l e s h a p e s ; c a p t u r e m o d e n o n e \. / ) ;
1277+
1278+ await page . locator ( '[data-shape-tool="rectangle"]' ) . click ( ) ;
1279+ await expect ( page . locator ( "#objectVectorStudioV2ShapeCount" ) ) . toHaveValue ( "1 shape" ) ;
1280+ await expect ( page . locator ( "#objectVectorStudioV2RenderSurface [data-shape-id='rectangle-1']" ) ) . toHaveClass ( / i s - s e l e c t e d / ) ;
1281+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"selectedShape"' ) ;
1282+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"type": "rectangle"' ) ;
1283+ await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails" ) ) . toContainText ( "Rectangle primitive metadata" ) ;
1284+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K C r e a t e d r e c t a n g l e s h a p e r e c t a n g l e - 1 o n A s t e r o i d s S h i p \. / ) ;
1285+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K R e n d e r m o d e s v g - w o r k - s u r f a c e : r e n d e r e d A s t e r o i d s S h i p w i t h 1 v i s i b l e s h a p e s ; c a p t u r e m o d e n o n e \. / ) ;
1286+
1287+ await page . locator ( '[data-shape-tool="circle"]' ) . click ( ) ;
1288+ await expect ( page . locator ( "#objectVectorStudioV2ShapeCount" ) ) . toHaveValue ( "2 shapes" ) ;
1289+ await expect ( page . locator ( "#objectVectorStudioV2RenderSurface [data-shape-id='circle-2']" ) ) . toHaveClass ( / i s - s e l e c t e d / ) ;
1290+ await page . locator ( "#objectVectorStudioV2RenderSurface [data-shape-id='rectangle-1']" ) . click ( ) ;
1291+ await expect ( page . locator ( "#objectVectorStudioV2RenderSurface [data-shape-id='rectangle-1']" ) ) . toHaveClass ( / i s - s e l e c t e d / ) ;
1292+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K S e l e c t e d s h a p e f r o m r e n d e r s u r f a c e : r e c t a n g l e - 1 \( r e c t a n g l e \) \. / ) ;
1293+
1294+ await page . locator ( "[data-palette-color='#6fd3ff']" ) . click ( ) ;
1295+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"fill": "#6fd3ff"' ) ;
1296+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K A p p l i e d p a l e t t e c o l o r # 6 f d 3 f f f r o m c y a n t o s h a p e r e c t a n g l e - 1 \. / ) ;
1297+
1298+ await page . locator ( "#objectVectorStudioV2ShapeVisibilityButton" ) . click ( ) ;
1299+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"visible": false' ) ;
1300+ await expect ( page . locator ( "#objectVectorStudioV2RenderSurface [data-shape-id='rectangle-1']" ) ) . toHaveCount ( 0 ) ;
1301+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K S h a p e r e c t a n g l e - 1 v i s i b i l i t y s e t t o h i d d e n \. / ) ;
1302+
1303+ await page . locator ( "#objectVectorStudioV2ShapeVisibilityButton" ) . click ( ) ;
1304+ await expect ( page . locator ( "#objectVectorStudioV2RenderSurface [data-shape-id='rectangle-1']" ) ) . toHaveCount ( 1 ) ;
1305+ await page . locator ( "#objectVectorStudioV2ShapeLockButton" ) . click ( ) ;
1306+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"locked": true' ) ;
1307+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K S h a p e r e c t a n g l e - 1 l o c k s e t t o l o c k e d \. / ) ;
12391308
12401309 await page . locator ( '[data-object-id="object-2"]' ) . click ( ) ;
12411310 await expect ( page . locator ( '[data-object-id="object-2"]' ) ) . toHaveAttribute ( "aria-pressed" , "true" ) ;
@@ -1255,6 +1324,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12551324 await expect ( page . locator ( '[data-object-id="shield-pickup"]' ) ) . toHaveAttribute ( "aria-pressed" , "true" ) ;
12561325 await expect ( page . locator ( '[data-object-id="shield-pickup"]' ) ) . toContainText ( "Shield Pickup" ) ;
12571326 await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"type": "object"' ) ;
1327+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toContainText ( '"shapes": []' ) ;
12581328 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K A d d e d o b j e c t S h i e l d P i c k u p w i t h i d s h i e l d - p i c k u p \. / ) ;
12591329
12601330 await page . locator ( "#objectVectorStudioV2FlattenObjectButton" ) . click ( ) ;
0 commit comments