default-value-setter.spec.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {expect} from 'chai';
  2. import {DataType} from '../data-type.js';
  3. import {ServiceContainer} from '@e22m4u/js-service';
  4. import {defaultValueSetter} from './default-value-setter.js';
  5. describe('defaultValueSetter', function () {
  6. it('should return a nullish value as is when default values is disabled', function () {
  7. const container = new ServiceContainer();
  8. [undefined, null].forEach(value => {
  9. const res = defaultValueSetter(
  10. value,
  11. {type: DataType.ANY, default: 10},
  12. {noDefaultValues: true},
  13. container,
  14. );
  15. expect(res).to.be.eq(value);
  16. });
  17. });
  18. it('should return a nullish value as is when no default value is specified', function () {
  19. const container = new ServiceContainer();
  20. [undefined, null].forEach(value => {
  21. const res = defaultValueSetter(
  22. value,
  23. {type: DataType.ANY},
  24. undefined,
  25. container,
  26. );
  27. expect(res).to.be.eq(value);
  28. });
  29. });
  30. it('should return a non-nullish value as is', function () {
  31. const container = new ServiceContainer();
  32. const values = ['str', '', 10, 0, true, false, [1], [], {p: 1}, {}];
  33. values.forEach(value => {
  34. const res = defaultValueSetter(
  35. value,
  36. {type: DataType.ANY},
  37. undefined,
  38. container,
  39. );
  40. expect(res).to.be.eq(value);
  41. });
  42. });
  43. it('should return a non-nullish value as is even if the "default" option is specified', function () {
  44. const container = new ServiceContainer();
  45. const values = ['str', '', 10, 0, true, false, [1], [], {p: 1}, {}];
  46. values.forEach(value => {
  47. const res = defaultValueSetter(
  48. value,
  49. {type: DataType.ANY, default: 10},
  50. undefined,
  51. container,
  52. );
  53. expect(res).to.be.eq(value);
  54. });
  55. });
  56. it('should resolve a factory value from the "default" option', function () {
  57. const container = new ServiceContainer();
  58. [undefined, null].forEach(value => {
  59. let invoked = 0;
  60. const factory = (...args) => {
  61. invoked++;
  62. expect(args).to.be.eql([container]);
  63. return 10;
  64. };
  65. const res = defaultValueSetter(
  66. value,
  67. {type: DataType.ANY, default: factory},
  68. undefined,
  69. container,
  70. );
  71. expect(res).to.be.eq(10);
  72. expect(invoked).to.be.eq(1);
  73. });
  74. });
  75. it('should return a default value when a nullish value is given', function () {
  76. const container = new ServiceContainer();
  77. [undefined, null].forEach(value => {
  78. const res = defaultValueSetter(
  79. value,
  80. {type: DataType.ANY, default: 10},
  81. undefined,
  82. container,
  83. );
  84. expect(res).to.be.eq(10);
  85. });
  86. });
  87. it('should return a clone of a default value instead of its reference', function () {
  88. const container = new ServiceContainer();
  89. const defaultValue = {foo: 'bar'};
  90. [undefined, null].forEach(value => {
  91. const res = defaultValueSetter(
  92. value,
  93. {type: DataType.ANY, default: defaultValue},
  94. undefined,
  95. container,
  96. );
  97. expect(res).to.be.eql(defaultValue);
  98. expect(res).to.be.not.eq(defaultValue);
  99. });
  100. });
  101. });