resolveSlotNozzleDiameter.test.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * Tests for resolveSlotNozzleDiameter helper (#1899).
  3. *
  4. * The AMS Slot config picker must filter filament presets by the nozzle that
  5. * actually feeds a given AMS, not the hardcoded 0.4mm default. This resolver
  6. * reads the installed nozzle diameter from the printer status, honouring the
  7. * per-AMS extruder binding on dual-nozzle printers. It returns undefined when
  8. * the hardware hasn't been reported, so the caller keeps its own default.
  9. */
  10. import { describe, it, expect } from 'vitest';
  11. import { resolveSlotNozzleDiameter } from '../../utils/amsHelpers';
  12. describe('resolveSlotNozzleDiameter', () => {
  13. it('returns undefined when status is null or undefined', () => {
  14. expect(resolveSlotNozzleDiameter(null, 0)).toBeUndefined();
  15. expect(resolveSlotNozzleDiameter(undefined, 0)).toBeUndefined();
  16. });
  17. it('returns undefined when no nozzles are reported', () => {
  18. expect(resolveSlotNozzleDiameter({ nozzles: [] }, 0)).toBeUndefined();
  19. expect(resolveSlotNozzleDiameter({}, 0)).toBeUndefined();
  20. });
  21. it('returns undefined when the reported nozzle diameter is an empty default', () => {
  22. expect(resolveSlotNozzleDiameter({ nozzles: [{ nozzle_diameter: '' }] }, 0)).toBeUndefined();
  23. });
  24. it('returns the single-nozzle diameter regardless of amsId (no extruder map)', () => {
  25. const status = { nozzles: [{ nozzle_diameter: '0.6' }] };
  26. expect(resolveSlotNozzleDiameter(status, 0)).toBe('0.6');
  27. expect(resolveSlotNozzleDiameter(status, 3)).toBe('0.6');
  28. });
  29. it('resolves the per-AMS nozzle on a dual-nozzle printer via ams_extruder_map', () => {
  30. // AMS 0 → left nozzle (0.4), AMS 1 → right nozzle (0.6)
  31. const status = {
  32. nozzles: [{ nozzle_diameter: '0.4' }, { nozzle_diameter: '0.6' }],
  33. ams_extruder_map: { '0': 0, '1': 1 },
  34. };
  35. expect(resolveSlotNozzleDiameter(status, 0)).toBe('0.4');
  36. expect(resolveSlotNozzleDiameter(status, 1)).toBe('0.6');
  37. });
  38. it('falls back to the primary nozzle when the AMS is not in the extruder map', () => {
  39. const status = {
  40. nozzles: [{ nozzle_diameter: '0.4' }, { nozzle_diameter: '0.6' }],
  41. ams_extruder_map: { '0': 0 },
  42. };
  43. // AMS 5 has no mapping → index 0 (primary)
  44. expect(resolveSlotNozzleDiameter(status, 5)).toBe('0.4');
  45. });
  46. it('falls back to the primary nozzle when the mapped nozzle has no diameter', () => {
  47. // Dual-nozzle stub where the second entry is still an empty default.
  48. const status = {
  49. nozzles: [{ nozzle_diameter: '0.4' }, { nozzle_diameter: '' }],
  50. ams_extruder_map: { '1': 1 },
  51. };
  52. expect(resolveSlotNozzleDiameter(status, 1)).toBe('0.4');
  53. });
  54. });