reactive-base-state.test.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import { describe, it, expect } from 'vitest';
  6. import { ReactiveBaseState, Tracker } from '../src';
  7. describe('reactive-base-state', () => {
  8. it('base', () => {
  9. const state = new ReactiveBaseState(0);
  10. let autorunTimes = -1;
  11. const compute = Tracker.autorun<number>(() => {
  12. autorunTimes++;
  13. return autorunTimes <= 2 ? state.value : -1;
  14. });
  15. expect(state.hasDependents()).toEqual(true);
  16. expect(autorunTimes).toEqual(0);
  17. expect(compute.result).toEqual(0);
  18. state.value = 1;
  19. expect(compute.result).toEqual(0);
  20. expect(autorunTimes).toEqual(0);
  21. Tracker.flush();
  22. expect(compute.result).toEqual(1);
  23. expect(autorunTimes).toEqual(1);
  24. Tracker.flush();
  25. // Still 1!
  26. expect(compute.result).toEqual(1);
  27. expect(autorunTimes).toEqual(1);
  28. state.value = 1;
  29. Tracker.flush();
  30. expect(compute.result).toEqual(1);
  31. expect(autorunTimes).toEqual(1);
  32. state.value = 2;
  33. Tracker.flush();
  34. expect(compute.result).toEqual(2);
  35. expect(autorunTimes).toEqual(2);
  36. state.value = 3;
  37. Tracker.flush();
  38. expect(compute.result).toEqual(-1);
  39. expect(autorunTimes).toEqual(3);
  40. state.value = 4;
  41. Tracker.flush();
  42. // Still 1!
  43. expect(compute.result).toEqual(-1);
  44. expect(autorunTimes).toEqual(3);
  45. });
  46. it('custom isEqual', () => {
  47. const state = new ReactiveBaseState(0, {
  48. isEqual: () => false,
  49. });
  50. let autorunTimes = 0;
  51. Tracker.autorun<number>(() => {
  52. autorunTimes++;
  53. return state.value;
  54. });
  55. // isEqual 不再判断是否相等, 所以会触发刷新
  56. state.value = 0;
  57. Tracker.flush();
  58. expect(autorunTimes).toEqual(2);
  59. });
  60. });