viewmodel.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Only tests the following:
  3. * - .$get()
  4. * - .$set()
  5. * - .$watch()
  6. * - .$unwatch()
  7. */
  8. var seed = require('seed')
  9. describe('UNIT: ViewModel', function () {
  10. mock('vm-test', '{{a.b.c}}')
  11. var data = {
  12. b: {
  13. c: 12345
  14. }
  15. },
  16. arr = [1, 2, 3],
  17. vm = new seed.ViewModel({
  18. el: '#vm-test',
  19. data: {
  20. a: data,
  21. b: arr
  22. }
  23. })
  24. describe('.$get()', function () {
  25. it('should retrieve correct value', function () {
  26. assert.strictEqual(vm.$get('a.b.c'), data.b.c)
  27. })
  28. })
  29. describe('.$set()', function () {
  30. vm.$set('a.b.c', 54321)
  31. it('should set correct value', function () {
  32. assert.strictEqual(data.b.c, 54321)
  33. })
  34. })
  35. describe('.$watch()', function () {
  36. it('should trigger callback when a plain value changes', function () {
  37. var val
  38. vm.$watch('a.b.c', function (newVal) {
  39. val = newVal
  40. })
  41. data.b.c = 'new value!'
  42. assert.strictEqual(val, data.b.c)
  43. })
  44. it('should trigger callback when an object value changes', function () {
  45. var val, subVal, rootVal,
  46. target = { c: 'hohoho' }
  47. vm.$watch('a.b', function (newVal) {
  48. val = newVal
  49. })
  50. vm.$watch('a.b.c', function (newVal) {
  51. subVal = newVal
  52. })
  53. vm.$watch('a', function (newVal) {
  54. rootVal = newVal
  55. })
  56. data.b = target
  57. assert.strictEqual(val, target)
  58. assert.strictEqual(subVal, target.c)
  59. vm.a = 'hehehe'
  60. assert.strictEqual(rootVal, 'hehehe')
  61. })
  62. it('should trigger callback when an array mutates', function () {
  63. var val, mut
  64. vm.$watch('b', function (array, mutation) {
  65. val = array
  66. mut = mutation
  67. })
  68. arr.push(4)
  69. assert.strictEqual(val, arr)
  70. assert.strictEqual(mut.method, 'push')
  71. assert.strictEqual(mut.args.length, 1)
  72. assert.strictEqual(mut.args[0], 4)
  73. })
  74. })
  75. describe('.$unwatch()', function () {
  76. it('should unwatch the stuff', function () {
  77. var triggered = false
  78. vm.$watch('a.b.c', function () {
  79. triggered = true
  80. })
  81. vm.$watch('a', function () {
  82. triggered = true
  83. })
  84. vm.$watch('b', function () {
  85. triggered = true
  86. })
  87. vm.$unwatch('a')
  88. vm.$unwatch('b')
  89. vm.$unwatch('a.b.c')
  90. vm.a = { b: { c:123123 }}
  91. vm.b.push(5)
  92. assert.notOk(triggered)
  93. })
  94. })
  95. describe('.$on', function () {
  96. it('should register listener on vm\'s compiler\'s emitter', function () {
  97. var t = new seed.ViewModel(),
  98. triggered = false,
  99. msg = 'on test'
  100. t.$on('test', function (m) {
  101. assert.strictEqual(m, msg)
  102. triggered = true
  103. })
  104. t.$compiler.emitter.emit('test', msg)
  105. assert.ok(triggered)
  106. })
  107. })
  108. describe('$off', function () {
  109. it('should turn off the listener', function () {
  110. var t = new seed.ViewModel(),
  111. triggered1 = false,
  112. triggered2 = false,
  113. f1 = function () {
  114. triggered1 = true
  115. },
  116. f2 = function () {
  117. triggered2 = true
  118. }
  119. t.$on('test', f1)
  120. t.$on('test', f2)
  121. t.$off('test', f1)
  122. t.$compiler.emitter.emit('test')
  123. assert.notOk(triggered1)
  124. assert.ok(triggered2)
  125. })
  126. })
  127. describe('.$broadcast()', function () {
  128. it('should notify all child VMs', function () {
  129. var triggered = 0,
  130. msg = 'broadcast test'
  131. var Child = seed.ViewModel.extend({
  132. init: function () {
  133. this.$on('hello', function (m) {
  134. assert.strictEqual(m, msg)
  135. triggered++
  136. })
  137. }
  138. })
  139. var Test = seed.ViewModel.extend({
  140. template: '<div sd-viewmodel="test"></div><div sd-viewmodel="test"></div>',
  141. vms: {
  142. test: Child
  143. }
  144. })
  145. var t = new Test()
  146. t.$broadcast('hello', msg)
  147. assert.strictEqual(triggered, 2)
  148. })
  149. })
  150. describe('.$emit', function () {
  151. it('should notify all ancestor VMs', function (done) {
  152. var topTriggered = false,
  153. midTriggered = false,
  154. msg = 'emit test'
  155. var Bottom = seed.ViewModel.extend({
  156. init: function () {
  157. var self = this
  158. setTimeout(function () {
  159. self.$emit('hello', msg)
  160. assert.ok(topTriggered)
  161. assert.ok(midTriggered)
  162. done()
  163. }, 0)
  164. }
  165. })
  166. var Middle = seed.ViewModel.extend({
  167. template: '<div sd-viewmodel="bottom"></div>',
  168. vms: { bottom: Bottom },
  169. init: function () {
  170. this.$on('hello', function (m) {
  171. assert.strictEqual(m, msg)
  172. midTriggered = true
  173. })
  174. }
  175. })
  176. var Top = seed.ViewModel.extend({
  177. template: '<div sd-viewmodel="middle"></div>',
  178. vms: { middle: Middle },
  179. init: function () {
  180. this.$on('hello', function (m) {
  181. assert.strictEqual(m, msg)
  182. topTriggered = true
  183. })
  184. }
  185. })
  186. var t = new Top()
  187. })
  188. })
  189. })