@quenty/adorneeutils 3.4.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.6.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/adorneeutils@3.5.0...@quenty/adorneeutils@3.6.0) (2026-09-02)
7
+
8
+ ### Features
9
+
10
+ - **adorneeutils:** Add AdorneeUtils.setBoundingBoxCFrame ([d4b0fe8](https://github.com/Quenty/NevermoreEngine/commit/d4b0fe8f04b9e5ce26de76c47e387e6031ad87ec))
11
+
12
+ # [3.5.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/adorneeutils@3.4.0...@quenty/adorneeutils@3.5.0) (2026-08-28)
13
+
14
+ **Note:** Version bump only for package @quenty/adorneeutils
15
+
6
16
  # [3.4.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/adorneeutils@3.3.6...@quenty/adorneeutils@3.4.0) (2026-08-28)
7
17
 
8
18
  **Note:** Version bump only for package @quenty/adorneeutils
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quenty/adorneeutils",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "AdorneeUtils - Generic adornee functions to make attaching to objects in Roblox easier.",
5
5
  "keywords": [
6
6
  "Roblox",
@@ -25,6 +25,7 @@
25
25
  "preinstall": "npx only-allow pnpm"
26
26
  },
27
27
  "dependencies": {
28
+ "@quenty/jestutils": "1.1.0",
28
29
  "@quenty/loader": "10.11.1",
29
30
  "@quenty/maid": "3.12.0",
30
31
  "@quenty/nevermore-test-runner": "1.6.0",
@@ -36,5 +37,5 @@
36
37
  "publishConfig": {
37
38
  "access": "public"
38
39
  },
39
- "gitHead": "f75f93d5b2ac51cf7da3b7599788dcce31fd8a29"
40
+ "gitHead": "278f4ca25486a8ba0601704b27a11da8c77499c9"
40
41
  }
@@ -69,6 +69,38 @@ function AdorneeUtils.getBoundingBox(adornee: Instance): (CFrame?, Vector3?)
69
69
  end
70
70
  end
71
71
 
72
+ --[=[
73
+ Moves the adornee so its bounding box sits at the given cframe, keeping every part where it
74
+ sits relative to the others.
75
+
76
+ This is the counterpart to [AdorneeUtils.getBoundingBox], and is not the same as `PivotTo`,
77
+ which moves the adornee by its pivot rather than by the center of its bounds.
78
+
79
+ @param adornee Instance
80
+ @param cframe CFrame -- New bounding box cframe
81
+ @return boolean -- False when the adornee has no bounding box to move
82
+ ]=]
83
+ function AdorneeUtils.setBoundingBoxCFrame(adornee: Instance, cframe: CFrame): boolean
84
+ assert(typeof(adornee) == "Instance", "Adornee must by of type 'Instance'")
85
+ assert(typeof(cframe) == "CFrame", "Bad cframe")
86
+
87
+ local bbCFrame = AdorneeUtils.getBoundingBox(adornee)
88
+ if not bbCFrame then
89
+ return false
90
+ end
91
+
92
+ local relativeCFrames: { [BasePart]: CFrame } = {}
93
+ for _, part in AdorneeUtils.getParts(adornee) do
94
+ relativeCFrames[part] = bbCFrame:ToObjectSpace(part.CFrame)
95
+ end
96
+
97
+ for part, relativeCFrame in relativeCFrames do
98
+ part.CFrame = cframe:ToWorldSpace(relativeCFrame)
99
+ end
100
+
101
+ return true
102
+ end
103
+
72
104
  --[=[
73
105
  Returns whether a part is a part of an adornee
74
106
  @param adornee Instance
@@ -7,6 +7,7 @@ local require = require(script.Parent.loader).load(script)
7
7
 
8
8
  local AdorneeUtils = require("AdorneeUtils")
9
9
  local Jest = require("Jest")
10
+ local JestUtils = require("JestUtils")
10
11
  local Maid = require("Maid")
11
12
 
12
13
  local describe = Jest.Globals.describe
@@ -44,7 +45,7 @@ type Controller = {
44
45
  newHandlelessTool: () -> (Tool, BasePart),
45
46
  newAccessory: () -> (Accessory, BasePart),
46
47
  newClothing: () -> (Clothing, BasePart),
47
- destroy: () -> (),
48
+ Destroy: (self: Controller) -> (),
48
49
  }
49
50
 
50
51
  local function setup(): Controller
@@ -161,11 +162,13 @@ local function setup(): Controller
161
162
  return clothing, part
162
163
  end,
163
164
 
164
- destroy = function()
165
+ Destroy = function(_self)
165
166
  maid:DoCleaning()
166
167
  end,
167
168
  }
168
169
 
170
+ maid:GiveTask(JestUtils.afterThis(controller))
171
+
169
172
  return controller
170
173
  end
171
174
 
@@ -176,7 +179,7 @@ describe("Tool inheriting from Model", function()
176
179
 
177
180
  expect(tool:IsA("Model")).toEqual(true)
178
181
 
179
- controller.destroy()
182
+ controller:Destroy()
180
183
  end)
181
184
 
182
185
  it("adorns to the handle rather than the model bounding box", function()
@@ -189,7 +192,7 @@ describe("Tool inheriting from Model", function()
189
192
  expect(AdorneeUtils.getAlignedSize(tool)).toEqual(handle.Size)
190
193
  expect(AdorneeUtils.getRenderAdornee(tool)).toEqual(handle)
191
194
 
192
- controller.destroy()
195
+ controller:Destroy()
193
196
  end)
194
197
 
195
198
  it("does not fall back to another part when the tool has no handle", function()
@@ -202,7 +205,7 @@ describe("Tool inheriting from Model", function()
202
205
  expect(AdorneeUtils.getAlignedSize(tool)).toBeNil()
203
206
  expect(AdorneeUtils.getRenderAdornee(tool)).toBeNil()
204
207
 
205
- controller.destroy()
208
+ controller:Destroy()
206
209
  end)
207
210
 
208
211
  it("adorns to the handle even when the tool has a primary part", function()
@@ -212,7 +215,7 @@ describe("Tool inheriting from Model", function()
212
215
 
213
216
  expect(AdorneeUtils.getPart(tool)).toEqual(handle)
214
217
 
215
- controller.destroy()
218
+ controller:Destroy()
216
219
  end)
217
220
 
218
221
  it("leaves plain models on the model path", function()
@@ -223,7 +226,7 @@ describe("Tool inheriting from Model", function()
223
226
  expect(AdorneeUtils.getAlignedSize(model)).toEqual(MODEL_BOUNDING_BOX_SIZE)
224
227
  expect(AdorneeUtils.getRenderAdornee(model)).toEqual(model)
225
228
 
226
- controller.destroy()
229
+ controller:Destroy()
227
230
  end)
228
231
  end)
229
232
 
@@ -234,7 +237,7 @@ describe("AdorneeUtils.getCenter", function()
234
237
 
235
238
  expect(AdorneeUtils.getCenter(part)).toEqual(Vector3.new(1, 2, 3))
236
239
 
237
- controller.destroy()
240
+ controller:Destroy()
238
241
  end)
239
242
 
240
243
  it("returns the bounding box center of a model", function()
@@ -243,7 +246,7 @@ describe("AdorneeUtils.getCenter", function()
243
246
 
244
247
  expect(AdorneeUtils.getCenter(model)).toEqual(MODEL_BOUNDING_BOX_CFRAME.Position)
245
248
 
246
- controller.destroy()
249
+ controller:Destroy()
247
250
  end)
248
251
 
249
252
  it("returns the world position of an attachment", function()
@@ -253,7 +256,7 @@ describe("AdorneeUtils.getCenter", function()
253
256
 
254
257
  expect(AdorneeUtils.getCenter(attachment)).toEqual(Vector3.new(10, 1, 0))
255
258
 
256
- controller.destroy()
259
+ controller:Destroy()
257
260
  end)
258
261
 
259
262
  it("returns the root part position of a humanoid", function()
@@ -262,7 +265,7 @@ describe("AdorneeUtils.getCenter", function()
262
265
 
263
266
  expect(AdorneeUtils.getCenter(humanoid)).toEqual(ROOT_PART_CFRAME.Position)
264
267
 
265
- controller.destroy()
268
+ controller:Destroy()
266
269
  end)
267
270
 
268
271
  it("returns nil for a humanoid with no root part", function()
@@ -271,7 +274,7 @@ describe("AdorneeUtils.getCenter", function()
271
274
 
272
275
  expect(AdorneeUtils.getCenter(humanoid)).toBeNil()
273
276
 
274
- controller.destroy()
277
+ controller:Destroy()
275
278
  end)
276
279
 
277
280
  it("returns the handle position of an accessory", function()
@@ -280,7 +283,7 @@ describe("AdorneeUtils.getCenter", function()
280
283
 
281
284
  expect(AdorneeUtils.getCenter(accessory)).toEqual(ACCESSORY_HANDLE_CFRAME.Position)
282
285
 
283
- controller.destroy()
286
+ controller:Destroy()
284
287
  end)
285
288
 
286
289
  it("returns nil for an accessory with no part", function()
@@ -290,7 +293,7 @@ describe("AdorneeUtils.getCenter", function()
290
293
  expect(AdorneeUtils.getCenter(accessory)).toBeNil()
291
294
 
292
295
  accessory:Destroy()
293
- controller.destroy()
296
+ controller:Destroy()
294
297
  end)
295
298
 
296
299
  it("returns the part position of clothing", function()
@@ -299,7 +302,7 @@ describe("AdorneeUtils.getCenter", function()
299
302
 
300
303
  expect(AdorneeUtils.getCenter(clothing)).toEqual(CLOTHING_PART_CFRAME.Position)
301
304
 
302
- controller.destroy()
305
+ controller:Destroy()
303
306
  end)
304
307
 
305
308
  it("returns the handle position of a tool", function()
@@ -308,7 +311,7 @@ describe("AdorneeUtils.getCenter", function()
308
311
 
309
312
  expect(AdorneeUtils.getCenter(tool)).toEqual(HANDLE_CFRAME.Position)
310
313
 
311
- controller.destroy()
314
+ controller:Destroy()
312
315
  end)
313
316
 
314
317
  it("returns nil when a tool's handle is not a base part", function()
@@ -321,7 +324,7 @@ describe("AdorneeUtils.getCenter", function()
321
324
 
322
325
  expect(AdorneeUtils.getCenter(tool)).toBeNil()
323
326
 
324
- controller.destroy()
327
+ controller:Destroy()
325
328
  end)
326
329
 
327
330
  it("returns nil for an unsupported adornee", function()
@@ -330,7 +333,7 @@ describe("AdorneeUtils.getCenter", function()
330
333
 
331
334
  expect(AdorneeUtils.getCenter(folder)).toBeNil()
332
335
 
333
- controller.destroy()
336
+ controller:Destroy()
334
337
  end)
335
338
 
336
339
  it("throws for a non-instance", function()
@@ -354,7 +357,7 @@ describe("AdorneeUtils.getBoundingBox", function()
354
357
  expect(cframe).toEqual(MODEL_BOUNDING_BOX_CFRAME)
355
358
  expect(size).toEqual(MODEL_BOUNDING_BOX_SIZE)
356
359
 
357
- controller.destroy()
360
+ controller:Destroy()
358
361
  end)
359
362
 
360
363
  it("returns a zero sized box at an attachment's world cframe", function()
@@ -367,7 +370,7 @@ describe("AdorneeUtils.getBoundingBox", function()
367
370
  expect(cframe).toEqual(CFrame.new(10, 1, 0))
368
371
  expect(size).toEqual(Vector3.zero)
369
372
 
370
- controller.destroy()
373
+ controller:Destroy()
371
374
  end)
372
375
 
373
376
  it("returns the cframe and size of a base part", function()
@@ -379,7 +382,7 @@ describe("AdorneeUtils.getBoundingBox", function()
379
382
  expect(cframe).toEqual(CFrame.new(1, 2, 3))
380
383
  expect(size).toEqual(Vector3.new(4, 1, 2))
381
384
 
382
- controller.destroy()
385
+ controller:Destroy()
383
386
  end)
384
387
 
385
388
  it("returns the handle box of a tool rather than its model bounding box", function()
@@ -396,7 +399,7 @@ describe("AdorneeUtils.getBoundingBox", function()
396
399
  expect(cframe).toEqual(HANDLE_CFRAME)
397
400
  expect(size).toEqual(HANDLE_SIZE)
398
401
 
399
- controller.destroy()
402
+ controller:Destroy()
400
403
  end)
401
404
 
402
405
  it("returns nil for a tool with no handle", function()
@@ -408,7 +411,7 @@ describe("AdorneeUtils.getBoundingBox", function()
408
411
  expect(cframe).toBeNil()
409
412
  expect(size).toBeNil()
410
413
 
411
- controller.destroy()
414
+ controller:Destroy()
412
415
  end)
413
416
 
414
417
  it("returns the root part cframe and the character size for a humanoid", function()
@@ -420,7 +423,7 @@ describe("AdorneeUtils.getBoundingBox", function()
420
423
  expect(cframe).toEqual(ROOT_PART_CFRAME)
421
424
  expect(size).toEqual(CHARACTER_BOUNDING_BOX_SIZE)
422
425
 
423
- controller.destroy()
426
+ controller:Destroy()
424
427
  end)
425
428
 
426
429
  it("returns nil for an unsupported adornee", function()
@@ -432,7 +435,58 @@ describe("AdorneeUtils.getBoundingBox", function()
432
435
  expect(cframe).toBeNil()
433
436
  expect(size).toBeNil()
434
437
 
435
- controller.destroy()
438
+ controller:Destroy()
439
+ end)
440
+ end)
441
+
442
+ describe("AdorneeUtils.setBoundingBoxCFrame", function()
443
+ it("puts the bounding box where it was asked to go", function()
444
+ local controller = setup()
445
+ local model = controller.newModel()
446
+
447
+ local target = CFrame.new(20, 8, -4)
448
+ local moved = AdorneeUtils.setBoundingBoxCFrame(model, target)
449
+
450
+ local cframe = AdorneeUtils.getBoundingBox(model)
451
+
452
+ expect(moved).toBe(true)
453
+ expect(cframe).toEqual(target)
454
+
455
+ controller:Destroy()
456
+ end)
457
+
458
+ it("keeps parts where they sit relative to each other", function()
459
+ local controller = setup()
460
+ local model, first, second = controller.newModel()
461
+
462
+ local offset = first.CFrame:ToObjectSpace(second.CFrame)
463
+
464
+ AdorneeUtils.setBoundingBoxCFrame(model, CFrame.Angles(0, math.pi / 2, 0) + Vector3.new(20, 8, -4))
465
+
466
+ expect(first.CFrame:ToObjectSpace(second.CFrame)).toEqual(offset)
467
+
468
+ controller:Destroy()
469
+ end)
470
+
471
+ it("moves a lone part", function()
472
+ local controller = setup()
473
+ local part = controller.newPart(Vector3.new(4, 1, 2), CFrame.new(1, 2, 3))
474
+
475
+ local moved = AdorneeUtils.setBoundingBoxCFrame(part, CFrame.new(7, 7, 7))
476
+
477
+ expect(moved).toBe(true)
478
+ expect(part.CFrame).toEqual(CFrame.new(7, 7, 7))
479
+
480
+ controller:Destroy()
481
+ end)
482
+
483
+ it("reports nothing moved when the adornee has no parts", function()
484
+ local controller = setup()
485
+ local folder = controller.newFolder()
486
+
487
+ expect(AdorneeUtils.setBoundingBoxCFrame(folder, CFrame.new(1, 2, 3))).toBe(false)
488
+
489
+ controller:Destroy()
436
490
  end)
437
491
  end)
438
492
 
@@ -443,7 +497,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
443
497
 
444
498
  expect(AdorneeUtils.isPartOfAdornee(part, part)).toEqual(true)
445
499
 
446
- controller.destroy()
500
+ controller:Destroy()
447
501
  end)
448
502
 
449
503
  it("returns true for a descendant part", function()
@@ -452,7 +506,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
452
506
 
453
507
  expect(AdorneeUtils.isPartOfAdornee(model, first)).toEqual(true)
454
508
 
455
- controller.destroy()
509
+ controller:Destroy()
456
510
  end)
457
511
 
458
512
  it("returns true for a deeply nested part", function()
@@ -467,7 +521,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
467
521
 
468
522
  expect(AdorneeUtils.isPartOfAdornee(model, nested)).toEqual(true)
469
523
 
470
- controller.destroy()
524
+ controller:Destroy()
471
525
  end)
472
526
 
473
527
  it("returns false for an unrelated part", function()
@@ -477,7 +531,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
477
531
 
478
532
  expect(AdorneeUtils.isPartOfAdornee(model, other)).toEqual(false)
479
533
 
480
- controller.destroy()
534
+ controller:Destroy()
481
535
  end)
482
536
 
483
537
  it("returns true for a part of the humanoid's character", function()
@@ -486,7 +540,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
486
540
 
487
541
  expect(AdorneeUtils.isPartOfAdornee(humanoid, rootPart)).toEqual(true)
488
542
 
489
- controller.destroy()
543
+ controller:Destroy()
490
544
  end)
491
545
 
492
546
  it("returns false for a part outside the humanoid's character", function()
@@ -496,7 +550,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
496
550
 
497
551
  expect(AdorneeUtils.isPartOfAdornee(humanoid, other)).toEqual(false)
498
552
 
499
- controller.destroy()
553
+ controller:Destroy()
500
554
  end)
501
555
 
502
556
  it("returns false for a humanoid with no parent", function()
@@ -506,7 +560,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
506
560
 
507
561
  expect(AdorneeUtils.isPartOfAdornee(humanoid, part)).toEqual(false)
508
562
 
509
- controller.destroy()
563
+ controller:Destroy()
510
564
  end)
511
565
 
512
566
  it("returns true for the parts of a tool", function()
@@ -516,7 +570,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
516
570
  expect(AdorneeUtils.isPartOfAdornee(tool, handle)).toEqual(true)
517
571
  expect(AdorneeUtils.isPartOfAdornee(tool, blade)).toEqual(true)
518
572
 
519
- controller.destroy()
573
+ controller:Destroy()
520
574
  end)
521
575
 
522
576
  it("throws for a bad part", function()
@@ -532,7 +586,7 @@ describe("AdorneeUtils.isPartOfAdornee", function()
532
586
  AdorneeUtils.isPartOfAdornee(part, folder :: any)
533
587
  end).toThrow()
534
588
 
535
- controller.destroy()
589
+ controller:Destroy()
536
590
  end)
537
591
  end)
538
592
 
@@ -543,7 +597,7 @@ describe("AdorneeUtils.getParts", function()
543
597
 
544
598
  expect(AdorneeUtils.getParts(part)).toEqual({ part })
545
599
 
546
- controller.destroy()
600
+ controller:Destroy()
547
601
  end)
548
602
 
549
603
  it("includes the descendants of a base part", function()
@@ -554,7 +608,7 @@ describe("AdorneeUtils.getParts", function()
554
608
 
555
609
  expect(AdorneeUtils.getParts(part)).toEqual({ part, child })
556
610
 
557
- controller.destroy()
611
+ controller:Destroy()
558
612
  end)
559
613
 
560
614
  it("returns every part of a model", function()
@@ -563,7 +617,7 @@ describe("AdorneeUtils.getParts", function()
563
617
 
564
618
  expect(AdorneeUtils.getParts(model)).toEqual({ first, second })
565
619
 
566
- controller.destroy()
620
+ controller:Destroy()
567
621
  end)
568
622
 
569
623
  it("returns the nested parts of a model", function()
@@ -578,7 +632,7 @@ describe("AdorneeUtils.getParts", function()
578
632
 
579
633
  expect(AdorneeUtils.getParts(model)).toEqual({ nested })
580
634
 
581
- controller.destroy()
635
+ controller:Destroy()
582
636
  end)
583
637
 
584
638
  it("returns the character's parts for a humanoid", function()
@@ -590,7 +644,7 @@ describe("AdorneeUtils.getParts", function()
590
644
  expect(#parts).toEqual(2)
591
645
  expect(parts[1]).toEqual(rootPart)
592
646
 
593
- controller.destroy()
647
+ controller:Destroy()
594
648
  end)
595
649
 
596
650
  it("returns an empty list for a humanoid with no parent", function()
@@ -599,7 +653,7 @@ describe("AdorneeUtils.getParts", function()
599
653
 
600
654
  expect(AdorneeUtils.getParts(humanoid)).toEqual({})
601
655
 
602
- controller.destroy()
656
+ controller:Destroy()
603
657
  end)
604
658
 
605
659
  it("returns every part of a tool", function()
@@ -608,7 +662,7 @@ describe("AdorneeUtils.getParts", function()
608
662
 
609
663
  expect(AdorneeUtils.getParts(tool)).toEqual({ blade, handle })
610
664
 
611
- controller.destroy()
665
+ controller:Destroy()
612
666
  end)
613
667
 
614
668
  it("returns an empty list for an adornee with no parts", function()
@@ -617,7 +671,7 @@ describe("AdorneeUtils.getParts", function()
617
671
 
618
672
  expect(AdorneeUtils.getParts(folder)).toEqual({})
619
673
 
620
- controller.destroy()
674
+ controller:Destroy()
621
675
  end)
622
676
 
623
677
  it("throws for a non-instance", function()
@@ -634,7 +688,7 @@ describe("AdorneeUtils.getAlignedSize", function()
634
688
 
635
689
  expect(AdorneeUtils.getAlignedSize(model)).toEqual(MODEL_BOUNDING_BOX_SIZE)
636
690
 
637
- controller.destroy()
691
+ controller:Destroy()
638
692
  end)
639
693
 
640
694
  it("returns the character bounding box size for a humanoid", function()
@@ -643,7 +697,7 @@ describe("AdorneeUtils.getAlignedSize", function()
643
697
 
644
698
  expect(AdorneeUtils.getAlignedSize(humanoid)).toEqual(CHARACTER_BOUNDING_BOX_SIZE)
645
699
 
646
- controller.destroy()
700
+ controller:Destroy()
647
701
  end)
648
702
 
649
703
  it("returns nil for a humanoid whose parent is not a model", function()
@@ -653,7 +707,7 @@ describe("AdorneeUtils.getAlignedSize", function()
653
707
 
654
708
  expect(AdorneeUtils.getAlignedSize(humanoid)).toBeNil()
655
709
 
656
- controller.destroy()
710
+ controller:Destroy()
657
711
  end)
658
712
 
659
713
  it("returns nil for a humanoid with no parent", function()
@@ -662,7 +716,7 @@ describe("AdorneeUtils.getAlignedSize", function()
662
716
 
663
717
  expect(AdorneeUtils.getAlignedSize(humanoid)).toBeNil()
664
718
 
665
- controller.destroy()
719
+ controller:Destroy()
666
720
  end)
667
721
 
668
722
  it("returns the size of a base part", function()
@@ -671,7 +725,7 @@ describe("AdorneeUtils.getAlignedSize", function()
671
725
 
672
726
  expect(AdorneeUtils.getAlignedSize(part)).toEqual(Vector3.new(4, 1, 2))
673
727
 
674
- controller.destroy()
728
+ controller:Destroy()
675
729
  end)
676
730
 
677
731
  it("returns the ancestor part size for an attachment", function()
@@ -681,7 +735,7 @@ describe("AdorneeUtils.getAlignedSize", function()
681
735
 
682
736
  expect(AdorneeUtils.getAlignedSize(attachment)).toEqual(Vector3.new(4, 1, 2))
683
737
 
684
- controller.destroy()
738
+ controller:Destroy()
685
739
  end)
686
740
 
687
741
  it("returns the handle size of a tool", function()
@@ -690,7 +744,7 @@ describe("AdorneeUtils.getAlignedSize", function()
690
744
 
691
745
  expect(AdorneeUtils.getAlignedSize(tool)).toEqual(HANDLE_SIZE)
692
746
 
693
- controller.destroy()
747
+ controller:Destroy()
694
748
  end)
695
749
 
696
750
  it("returns nil for a tool with no handle", function()
@@ -699,7 +753,7 @@ describe("AdorneeUtils.getAlignedSize", function()
699
753
 
700
754
  expect(AdorneeUtils.getAlignedSize(tool)).toBeNil()
701
755
 
702
- controller.destroy()
756
+ controller:Destroy()
703
757
  end)
704
758
 
705
759
  it("returns nil for an unsupported adornee", function()
@@ -708,7 +762,7 @@ describe("AdorneeUtils.getAlignedSize", function()
708
762
 
709
763
  expect(AdorneeUtils.getAlignedSize(folder)).toBeNil()
710
764
 
711
- controller.destroy()
765
+ controller:Destroy()
712
766
  end)
713
767
  end)
714
768
 
@@ -719,7 +773,7 @@ describe("AdorneeUtils.getPartCFrame", function()
719
773
 
720
774
  expect(AdorneeUtils.getPartCFrame(part)).toEqual(CFrame.new(1, 2, 3))
721
775
 
722
- controller.destroy()
776
+ controller:Destroy()
723
777
  end)
724
778
 
725
779
  it("returns the handle cframe of a tool", function()
@@ -728,7 +782,7 @@ describe("AdorneeUtils.getPartCFrame", function()
728
782
 
729
783
  expect(AdorneeUtils.getPartCFrame(tool)).toEqual(HANDLE_CFRAME)
730
784
 
731
- controller.destroy()
785
+ controller:Destroy()
732
786
  end)
733
787
 
734
788
  it("returns the root part cframe of a humanoid", function()
@@ -737,7 +791,7 @@ describe("AdorneeUtils.getPartCFrame", function()
737
791
 
738
792
  expect(AdorneeUtils.getPartCFrame(humanoid)).toEqual(ROOT_PART_CFRAME)
739
793
 
740
- controller.destroy()
794
+ controller:Destroy()
741
795
  end)
742
796
 
743
797
  it("returns nil for an adornee with no part", function()
@@ -746,7 +800,7 @@ describe("AdorneeUtils.getPartCFrame", function()
746
800
 
747
801
  expect(AdorneeUtils.getPartCFrame(folder)).toBeNil()
748
802
 
749
- controller.destroy()
803
+ controller:Destroy()
750
804
  end)
751
805
 
752
806
  it("throws for a non-instance", function()
@@ -763,7 +817,7 @@ describe("AdorneeUtils.getPartPosition", function()
763
817
 
764
818
  expect(AdorneeUtils.getPartPosition(part)).toEqual(Vector3.new(1, 2, 3))
765
819
 
766
- controller.destroy()
820
+ controller:Destroy()
767
821
  end)
768
822
 
769
823
  it("returns the primary part position of a model", function()
@@ -773,7 +827,7 @@ describe("AdorneeUtils.getPartPosition", function()
773
827
 
774
828
  expect(AdorneeUtils.getPartPosition(model)).toEqual(second.Position)
775
829
 
776
- controller.destroy()
830
+ controller:Destroy()
777
831
  end)
778
832
 
779
833
  it("returns the root part position of a humanoid", function()
@@ -782,7 +836,7 @@ describe("AdorneeUtils.getPartPosition", function()
782
836
 
783
837
  expect(AdorneeUtils.getPartPosition(humanoid)).toEqual(ROOT_PART_CFRAME.Position)
784
838
 
785
- controller.destroy()
839
+ controller:Destroy()
786
840
  end)
787
841
 
788
842
  it("returns nil for an adornee with no part", function()
@@ -791,7 +845,7 @@ describe("AdorneeUtils.getPartPosition", function()
791
845
 
792
846
  expect(AdorneeUtils.getPartPosition(folder)).toBeNil()
793
847
 
794
- controller.destroy()
848
+ controller:Destroy()
795
849
  end)
796
850
 
797
851
  it("throws for a non-instance", function()
@@ -810,7 +864,7 @@ describe("AdorneeUtils.getPartVelocity", function()
810
864
 
811
865
  expect(AdorneeUtils.getPartVelocity(part)).toEqual(Vector3.new(1, 2, 3))
812
866
 
813
- controller.destroy()
867
+ controller:Destroy()
814
868
  end)
815
869
 
816
870
  it("returns zero for an anchored part", function()
@@ -819,7 +873,7 @@ describe("AdorneeUtils.getPartVelocity", function()
819
873
 
820
874
  expect(AdorneeUtils.getPartVelocity(part)).toEqual(Vector3.zero)
821
875
 
822
- controller.destroy()
876
+ controller:Destroy()
823
877
  end)
824
878
 
825
879
  it("returns the handle velocity of a tool", function()
@@ -830,7 +884,7 @@ describe("AdorneeUtils.getPartVelocity", function()
830
884
 
831
885
  expect(AdorneeUtils.getPartVelocity(tool)).toEqual(Vector3.new(0, 5, 0))
832
886
 
833
- controller.destroy()
887
+ controller:Destroy()
834
888
  end)
835
889
 
836
890
  it("returns nil for an adornee with no part", function()
@@ -839,7 +893,7 @@ describe("AdorneeUtils.getPartVelocity", function()
839
893
 
840
894
  expect(AdorneeUtils.getPartVelocity(folder)).toBeNil()
841
895
 
842
- controller.destroy()
896
+ controller:Destroy()
843
897
  end)
844
898
  end)
845
899
 
@@ -850,7 +904,7 @@ describe("AdorneeUtils.getPart", function()
850
904
 
851
905
  expect(AdorneeUtils.getPart(part)).toEqual(part)
852
906
 
853
- controller.destroy()
907
+ controller:Destroy()
854
908
  end)
855
909
 
856
910
  it("returns a model's primary part", function()
@@ -860,7 +914,7 @@ describe("AdorneeUtils.getPart", function()
860
914
 
861
915
  expect(AdorneeUtils.getPart(model)).toEqual(second)
862
916
 
863
- controller.destroy()
917
+ controller:Destroy()
864
918
  end)
865
919
 
866
920
  it("returns a model's first base part when there is no primary part", function()
@@ -869,7 +923,7 @@ describe("AdorneeUtils.getPart", function()
869
923
 
870
924
  expect(AdorneeUtils.getPart(model)).toEqual(first)
871
925
 
872
- controller.destroy()
926
+ controller:Destroy()
873
927
  end)
874
928
 
875
929
  it("returns nil for a model with no parts", function()
@@ -878,7 +932,7 @@ describe("AdorneeUtils.getPart", function()
878
932
 
879
933
  expect(AdorneeUtils.getPart(model)).toBeNil()
880
934
 
881
- controller.destroy()
935
+ controller:Destroy()
882
936
  end)
883
937
 
884
938
  it("returns nil for a model whose parts are not direct children", function()
@@ -893,7 +947,7 @@ describe("AdorneeUtils.getPart", function()
893
947
 
894
948
  expect(AdorneeUtils.getPart(model)).toBeNil()
895
949
 
896
- controller.destroy()
950
+ controller:Destroy()
897
951
  end)
898
952
 
899
953
  it("returns the ancestor part of an attachment", function()
@@ -903,7 +957,7 @@ describe("AdorneeUtils.getPart", function()
903
957
 
904
958
  expect(AdorneeUtils.getPart(attachment)).toEqual(part)
905
959
 
906
- controller.destroy()
960
+ controller:Destroy()
907
961
  end)
908
962
 
909
963
  it("returns nil for an attachment with no ancestor part", function()
@@ -913,7 +967,7 @@ describe("AdorneeUtils.getPart", function()
913
967
 
914
968
  expect(AdorneeUtils.getPart(attachment)).toBeNil()
915
969
 
916
- controller.destroy()
970
+ controller:Destroy()
917
971
  end)
918
972
 
919
973
  it("returns the root part of a humanoid", function()
@@ -922,7 +976,7 @@ describe("AdorneeUtils.getPart", function()
922
976
 
923
977
  expect(AdorneeUtils.getPart(humanoid)).toEqual(rootPart)
924
978
 
925
- controller.destroy()
979
+ controller:Destroy()
926
980
  end)
927
981
 
928
982
  it("returns nil for a humanoid with no root part", function()
@@ -931,7 +985,7 @@ describe("AdorneeUtils.getPart", function()
931
985
 
932
986
  expect(AdorneeUtils.getPart(humanoid)).toBeNil()
933
987
 
934
- controller.destroy()
988
+ controller:Destroy()
935
989
  end)
936
990
 
937
991
  it("returns the handle of an accessory", function()
@@ -940,7 +994,7 @@ describe("AdorneeUtils.getPart", function()
940
994
 
941
995
  expect(AdorneeUtils.getPart(accessory)).toEqual(handle)
942
996
 
943
- controller.destroy()
997
+ controller:Destroy()
944
998
  end)
945
999
 
946
1000
  it("returns the part of clothing", function()
@@ -949,7 +1003,7 @@ describe("AdorneeUtils.getPart", function()
949
1003
 
950
1004
  expect(AdorneeUtils.getPart(clothing)).toEqual(part)
951
1005
 
952
- controller.destroy()
1006
+ controller:Destroy()
953
1007
  end)
954
1008
 
955
1009
  it("returns the handle of a tool ahead of any other part", function()
@@ -958,7 +1012,7 @@ describe("AdorneeUtils.getPart", function()
958
1012
 
959
1013
  expect(AdorneeUtils.getPart(tool)).toEqual(handle)
960
1014
 
961
- controller.destroy()
1015
+ controller:Destroy()
962
1016
  end)
963
1017
 
964
1018
  it("returns nil for a tool with no handle", function()
@@ -967,7 +1021,7 @@ describe("AdorneeUtils.getPart", function()
967
1021
 
968
1022
  expect(AdorneeUtils.getPart(tool)).toBeNil()
969
1023
 
970
- controller.destroy()
1024
+ controller:Destroy()
971
1025
  end)
972
1026
 
973
1027
  it("returns nil for an unsupported adornee", function()
@@ -976,7 +1030,7 @@ describe("AdorneeUtils.getPart", function()
976
1030
 
977
1031
  expect(AdorneeUtils.getPart(folder)).toBeNil()
978
1032
 
979
- controller.destroy()
1033
+ controller:Destroy()
980
1034
  end)
981
1035
 
982
1036
  it("throws for a non-instance", function()
@@ -993,7 +1047,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
993
1047
 
994
1048
  expect(AdorneeUtils.getRenderAdornee(part)).toEqual(part)
995
1049
 
996
- controller.destroy()
1050
+ controller:Destroy()
997
1051
  end)
998
1052
 
999
1053
  it("returns a model itself", function()
@@ -1002,7 +1056,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1002
1056
 
1003
1057
  expect(AdorneeUtils.getRenderAdornee(model)).toEqual(model)
1004
1058
 
1005
- controller.destroy()
1059
+ controller:Destroy()
1006
1060
  end)
1007
1061
 
1008
1062
  it("returns an attachment itself", function()
@@ -1012,7 +1066,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1012
1066
 
1013
1067
  expect(AdorneeUtils.getRenderAdornee(attachment)).toEqual(attachment)
1014
1068
 
1015
- controller.destroy()
1069
+ controller:Destroy()
1016
1070
  end)
1017
1071
 
1018
1072
  it("returns the character of a humanoid", function()
@@ -1021,7 +1075,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1021
1075
 
1022
1076
  expect(AdorneeUtils.getRenderAdornee(humanoid)).toEqual(character)
1023
1077
 
1024
- controller.destroy()
1078
+ controller:Destroy()
1025
1079
  end)
1026
1080
 
1027
1081
  it("returns nil for a humanoid with no parent", function()
@@ -1030,7 +1084,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1030
1084
 
1031
1085
  expect(AdorneeUtils.getRenderAdornee(humanoid)).toBeNil()
1032
1086
 
1033
- controller.destroy()
1087
+ controller:Destroy()
1034
1088
  end)
1035
1089
 
1036
1090
  it("returns the handle of an accessory", function()
@@ -1039,7 +1093,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1039
1093
 
1040
1094
  expect(AdorneeUtils.getRenderAdornee(accessory)).toEqual(handle)
1041
1095
 
1042
- controller.destroy()
1096
+ controller:Destroy()
1043
1097
  end)
1044
1098
 
1045
1099
  it("returns the part of clothing", function()
@@ -1048,7 +1102,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1048
1102
 
1049
1103
  expect(AdorneeUtils.getRenderAdornee(clothing)).toEqual(part)
1050
1104
 
1051
- controller.destroy()
1105
+ controller:Destroy()
1052
1106
  end)
1053
1107
 
1054
1108
  it("returns the handle of a tool rather than the tool", function()
@@ -1057,7 +1111,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1057
1111
 
1058
1112
  expect(AdorneeUtils.getRenderAdornee(tool)).toEqual(handle)
1059
1113
 
1060
- controller.destroy()
1114
+ controller:Destroy()
1061
1115
  end)
1062
1116
 
1063
1117
  it("returns nil for a tool with no handle", function()
@@ -1066,7 +1120,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1066
1120
 
1067
1121
  expect(AdorneeUtils.getRenderAdornee(tool)).toBeNil()
1068
1122
 
1069
- controller.destroy()
1123
+ controller:Destroy()
1070
1124
  end)
1071
1125
 
1072
1126
  it("returns nil for an unsupported adornee", function()
@@ -1075,7 +1129,7 @@ describe("AdorneeUtils.getRenderAdornee", function()
1075
1129
 
1076
1130
  expect(AdorneeUtils.getRenderAdornee(folder)).toBeNil()
1077
1131
 
1078
- controller.destroy()
1132
+ controller:Destroy()
1079
1133
  end)
1080
1134
 
1081
1135
  it("throws for a non-instance", function()