@@ -70,6 +70,8 @@ describe("GraphicsBlocks", () => {
7070 doArc : jest . fn ( ) ,
7171 doForward : jest . fn ( ) ,
7272 doRight : jest . fn ( ) ,
73+ setControlPoint1 : jest . fn ( ) ,
74+ setControlPoint2 : jest . fn ( ) ,
7375 penState : true ,
7476 wrap : false
7577 } ,
@@ -196,4 +198,188 @@ describe("GraphicsBlocks", () => {
196198 block . flow ( [ 90 , 100 ] , logo , turtle , 1 ) ;
197199 expect ( turtleObj . painter . doArc ) . toHaveBeenCalledWith ( 90 , 100 ) ;
198200 } ) ;
201+
202+ // ── SetHeadingBlock ─────────────────────────────
203+ describe ( "SetHeadingBlock (setheading)" , ( ) => {
204+ test ( "SetHeadingBlock is registered" , ( ) => {
205+ expect ( activity . blocks . setheading ) . toBeDefined ( ) ;
206+ } ) ;
207+ test ( "flow calls doSetHeading with correct angle" , ( ) => {
208+ const block = new activity . blocks . setheading ( ) ;
209+ block . flow ( [ 90 ] , logo , turtle , 1 ) ;
210+ expect ( turtleObj . painter . doSetHeading ) . toHaveBeenCalledWith ( 90 ) ;
211+ } ) ;
212+ test ( "flow calls doSetHeading with 0 degrees" , ( ) => {
213+ const block = new activity . blocks . setheading ( ) ;
214+ block . flow ( [ 0 ] , logo , turtle , 1 ) ;
215+ expect ( turtleObj . painter . doSetHeading ) . toHaveBeenCalledWith ( 0 ) ;
216+ } ) ;
217+ test ( "flow calls doSetHeading with negative angle" , ( ) => {
218+ const block = new activity . blocks . setheading ( ) ;
219+ block . flow ( [ - 45 ] , logo , turtle , 1 ) ;
220+ expect ( turtleObj . painter . doSetHeading ) . toHaveBeenCalledWith ( - 45 ) ;
221+ } ) ;
222+ } ) ;
223+
224+ // ── MLeftBlock ───────────────────────────────────
225+ describe ( "MLeftBlock (left)" , ( ) => {
226+ test ( "MLeftBlock is registered" , ( ) => {
227+ expect ( activity . blocks . left ) . toBeDefined ( ) ;
228+ } ) ;
229+ test ( "flow turns turtle left (negative right)" , ( ) => {
230+ const block = new activity . blocks . left ( ) ;
231+ block . flow ( [ 90 ] , logo , turtle , 1 ) ;
232+ expect ( turtleObj . painter . doRight ) . toHaveBeenCalledWith ( - 90 ) ;
233+ } ) ;
234+ test ( "flow with 0 degrees" , ( ) => {
235+ const block = new activity . blocks . left ( ) ;
236+ block . flow ( [ 0 ] , logo , turtle , 1 ) ;
237+ expect ( turtleObj . painter . doRight ) . toHaveBeenCalledWith ( - 0 ) ;
238+ } ) ;
239+ test ( "flow with 180 degrees" , ( ) => {
240+ const block = new activity . blocks . left ( ) ;
241+ block . flow ( [ 180 ] , logo , turtle , 1 ) ;
242+ expect ( turtleObj . painter . doRight ) . toHaveBeenCalledWith ( - 180 ) ;
243+ } ) ;
244+ } ) ;
245+
246+ // ── BezierBlock ──────────────────────────────────
247+ describe ( "BezierBlock (bezier)" , ( ) => {
248+ test ( "BezierBlock is registered" , ( ) => {
249+ expect ( activity . blocks . bezier ) . toBeDefined ( ) ;
250+ } ) ;
251+ test ( "flow calls doBezier with correct args" , ( ) => {
252+ const block = new activity . blocks . bezier ( ) ;
253+ block . flow ( [ 100 , 150 ] , logo , turtle , 1 ) ;
254+ expect ( turtleObj . painter . doBezier ) . toHaveBeenCalledWith ( 100 , 150 ) ;
255+ } ) ;
256+ test ( "flow called with zero values" , ( ) => {
257+ const block = new activity . blocks . bezier ( ) ;
258+ block . flow ( [ 0 , 0 ] , logo , turtle , 1 ) ;
259+ expect ( turtleObj . painter . doBezier ) . toHaveBeenCalledWith ( 0 , 0 ) ;
260+ } ) ;
261+ test ( "flow called with negative values" , ( ) => {
262+ const block = new activity . blocks . bezier ( ) ;
263+ block . flow ( [ - 50 , - 75 ] , logo , turtle , 1 ) ;
264+ expect ( turtleObj . painter . doBezier ) . toHaveBeenCalledWith ( - 50 , - 75 ) ;
265+ } ) ;
266+ } ) ;
267+
268+ // ── ControlPoint1Block ───────────────────────────
269+ describe ( "ControlPoint1Block (controlpoint1)" , ( ) => {
270+ test ( "ControlPoint1Block is registered" , ( ) => {
271+ expect ( activity . blocks . controlpoint1 ) . toBeDefined ( ) ;
272+ } ) ;
273+ test ( "flow calls setControlPoint1" , ( ) => {
274+ const block = new activity . blocks . controlpoint1 ( ) ;
275+ block . flow ( [ 50 , 60 ] , logo , turtle , 1 ) ;
276+ expect ( turtleObj . painter . setControlPoint1 ) . toHaveBeenCalledWith ( [ 50 , 60 ] ) ;
277+ } ) ;
278+ test ( "flow with zero values" , ( ) => {
279+ const block = new activity . blocks . controlpoint1 ( ) ;
280+ block . flow ( [ 0 , 0 ] , logo , turtle , 1 ) ;
281+ expect ( turtleObj . painter . setControlPoint1 ) . toHaveBeenCalledWith ( [ 0 , 0 ] ) ;
282+ } ) ;
283+ } ) ;
284+
285+ // ── ControlPoint2Block ───────────────────────────
286+ describe ( "ControlPoint2Block (controlpoint2)" , ( ) => {
287+ test ( "ControlPoint2Block is registered" , ( ) => {
288+ expect ( activity . blocks . controlpoint2 ) . toBeDefined ( ) ;
289+ } ) ;
290+ test ( "flow calls setControlPoint2" , ( ) => {
291+ const block = new activity . blocks . controlpoint2 ( ) ;
292+ block . flow ( [ 70 , 80 ] , logo , turtle , 1 ) ;
293+ expect ( turtleObj . painter . setControlPoint2 ) . toHaveBeenCalledWith ( [ 70 , 80 ] ) ;
294+ } ) ;
295+ test ( "flow with negative values" , ( ) => {
296+ const block = new activity . blocks . controlpoint2 ( ) ;
297+ block . flow ( [ - 30 , - 40 ] , logo , turtle , 1 ) ;
298+ expect ( turtleObj . painter . setControlPoint2 ) . toHaveBeenCalledWith ( [ - 30 , - 40 ] ) ;
299+ } ) ;
300+ } ) ;
301+
302+ // ── WrapModeBlock ────────────────────────────────
303+ describe ( "WrapModeBlock (wrapmode)" , ( ) => {
304+ test ( "WrapModeBlock is registered" , ( ) => {
305+ expect ( activity . blocks . wrapmode ) . toBeDefined ( ) ;
306+ } ) ;
307+ test ( "arg returns true when wrap is on" , ( ) => {
308+ turtleObj . painter . wrap = true ;
309+ const block = new activity . blocks . wrapmode ( ) ;
310+ expect ( block . arg ( logo , turtle , 0 ) ) . toBe ( true ) ;
311+ } ) ;
312+ test ( "arg returns false when wrap is off" , ( ) => {
313+ turtleObj . painter . wrap = false ;
314+ const block = new activity . blocks . wrapmode ( ) ;
315+ expect ( block . arg ( logo , turtle , 0 ) ) . toBe ( false ) ;
316+ } ) ;
317+ } ) ;
318+
319+ // ── WrapBlock ────────────────────────────────────
320+ describe ( "WrapBlock (wrap)" , ( ) => {
321+ test ( "WrapBlock is registered" , ( ) => {
322+ expect ( activity . blocks . wrap ) . toBeDefined ( ) ;
323+ } ) ;
324+ test ( "flow runs without error" , ( ) => {
325+ const block = new activity . blocks . wrap ( ) ;
326+ expect ( ( ) => block . flow ( [ true ] , logo , turtle , 1 ) ) . not . toThrow ( ) ;
327+ } ) ;
328+ } ) ;
329+
330+ // ── RightBlock extended ──────────────────────────
331+ describe ( "RightBlock extended" , ( ) => {
332+ test ( "RightBlock with 45 degrees" , ( ) => {
333+ const block = new activity . blocks . right ( ) ;
334+ block . flow ( [ 45 ] , logo , turtle , 1 ) ;
335+ expect ( turtleObj . painter . doRight ) . toHaveBeenCalledWith ( 45 ) ;
336+ } ) ;
337+ test ( "RightBlock with 360 degrees" , ( ) => {
338+ const block = new activity . blocks . right ( ) ;
339+ block . flow ( [ 360 ] , logo , turtle , 1 ) ;
340+ expect ( turtleObj . painter . doRight ) . toHaveBeenCalledWith ( 360 ) ;
341+ } ) ;
342+ } ) ;
343+
344+ // ── ForwardBlock extended ────────────────────────
345+ describe ( "ForwardBlock extended" , ( ) => {
346+ test ( "ForwardBlock with large value" , ( ) => {
347+ const block = new activity . blocks . forward ( ) ;
348+ block . flow ( [ 500 ] , logo , turtle , 1 ) ;
349+ expect ( turtleObj . painter . doForward ) . toHaveBeenCalledWith ( 500 ) ;
350+ } ) ;
351+ test ( "ForwardBlock with zero" , ( ) => {
352+ const block = new activity . blocks . forward ( ) ;
353+ block . flow ( [ 0 ] , logo , turtle , 1 ) ;
354+ expect ( turtleObj . painter . doForward ) . toHaveBeenCalledWith ( 0 ) ;
355+ } ) ;
356+ } ) ;
357+
358+ // ── ArcBlock extended ────────────────────────────
359+ describe ( "ArcBlock extended" , ( ) => {
360+ test ( "ArcBlock with full circle 360 degrees" , ( ) => {
361+ const block = new activity . blocks . arc ( ) ;
362+ block . flow ( [ 360 , 100 ] , logo , turtle , 1 ) ;
363+ expect ( turtleObj . painter . doArc ) . toHaveBeenCalledWith ( 360 , 100 ) ;
364+ } ) ;
365+ test ( "ArcBlock with small radius" , ( ) => {
366+ const block = new activity . blocks . arc ( ) ;
367+ block . flow ( [ 45 , 10 ] , logo , turtle , 1 ) ;
368+ expect ( turtleObj . painter . doArc ) . toHaveBeenCalledWith ( 45 , 10 ) ;
369+ } ) ;
370+ } ) ;
371+
372+ // ── SetXYBlock extended ──────────────────────────
373+ describe ( "SetXYBlock extended" , ( ) => {
374+ test ( "SetXYBlock with negative coordinates" , ( ) => {
375+ const block = new activity . blocks . setxy ( ) ;
376+ block . flow ( [ - 100 , - 200 ] , logo , turtle , 1 ) ;
377+ expect ( turtleObj . painter . doSetXY ) . toHaveBeenCalledWith ( - 100 , - 200 ) ;
378+ } ) ;
379+ test ( "SetXYBlock with zero coordinates" , ( ) => {
380+ const block = new activity . blocks . setxy ( ) ;
381+ block . flow ( [ 0 , 0 ] , logo , turtle , 1 ) ;
382+ expect ( turtleObj . painter . doSetXY ) . toHaveBeenCalledWith ( 0 , 0 ) ;
383+ } ) ;
384+ } ) ;
199385} ) ;
0 commit comments