148 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			148 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import {describe, it, iit, xit, expect, beforeEach, afterEach} from 'test_lib/test_lib'; | ||
|  | 
 | ||
|  | import {MapChanges} from 'change_detection/map_changes'; | ||
|  | 
 | ||
|  | import {isBlank, NumberWrapper} from 'facade/lang'; | ||
|  | 
 | ||
|  | import {MapWrapper} from 'facade/collection'; | ||
|  | 
 | ||
|  | // todo(vicb): Update the code & tests for object equality
 | ||
|  | export function main() { | ||
|  |   describe('map_changes', function() { | ||
|  |     describe('MapChanges', function() { | ||
|  |       var changes; | ||
|  |       var m; | ||
|  | 
 | ||
|  |       beforeEach(() => { | ||
|  |         changes = new MapChanges(); | ||
|  |         m = MapWrapper.create(); | ||
|  |       }); | ||
|  | 
 | ||
|  |       afterEach(() => { | ||
|  |         changes = null; | ||
|  |       }); | ||
|  | 
 | ||
|  |       it('should detect additions', () => { | ||
|  |         changes.check(m); | ||
|  | 
 | ||
|  |         MapWrapper.set(m, 'a', 1); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['a[null->1]'], | ||
|  |           additions: ['a[null->1]'] | ||
|  |         })); | ||
|  | 
 | ||
|  |         MapWrapper.set(m, 'b', 2); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['a', 'b[null->2]'], | ||
|  |           previous: ['a'], | ||
|  |           additions: ['b[null->2]'] | ||
|  |         })); | ||
|  |       }); | ||
|  | 
 | ||
|  |       it('should handle changing key/values correctly', () => { | ||
|  |         MapWrapper.set(m, 1, 10); | ||
|  |         MapWrapper.set(m, 2, 20); | ||
|  |         changes.check(m); | ||
|  | 
 | ||
|  |         MapWrapper.set(m, 2, 10); | ||
|  |         MapWrapper.set(m, 1, 20); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['1[10->20]', '2[20->10]'], | ||
|  |           previous: ['1[10->20]', '2[20->10]'], | ||
|  |           changes: ['1[10->20]', '2[20->10]'] | ||
|  |         })); | ||
|  |       }); | ||
|  | 
 | ||
|  |       it('should do basic map watching', () => { | ||
|  |         changes.check(m); | ||
|  | 
 | ||
|  |         MapWrapper.set(m, 'a', 'A'); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['a[null->A]'], | ||
|  |           additions: ['a[null->A]'] | ||
|  |         })); | ||
|  | 
 | ||
|  |         MapWrapper.set(m, 'b', 'B'); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['a', 'b[null->B]'], | ||
|  |           previous: ['a'], | ||
|  |           additions: ['b[null->B]'] | ||
|  |         })); | ||
|  | 
 | ||
|  |         MapWrapper.set(m, 'b', 'BB'); | ||
|  |         MapWrapper.set(m, 'd', 'D'); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['a', 'b[B->BB]', 'd[null->D]'], | ||
|  |           previous: ['a', 'b[B->BB]'], | ||
|  |           additions: ['d[null->D]'], | ||
|  |           changes: ['b[B->BB]'] | ||
|  |         })); | ||
|  | 
 | ||
|  |         MapWrapper.delete(m, 'b'); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['a', 'd'], | ||
|  |           previous: ['a', 'b[BB->null]', 'd'], | ||
|  |           removals: ['b[BB->null]'] | ||
|  |         })); | ||
|  | 
 | ||
|  |         MapWrapper.clear(m); | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           previous: ['a[A->null]', 'd[D->null]'], | ||
|  |           removals: ['a[A->null]', 'd[D->null]'] | ||
|  |         })); | ||
|  |       }); | ||
|  | 
 | ||
|  |       it('should test string by value rather than by reference (DART)', () => { | ||
|  |         MapWrapper.set(m, 'foo', 'bar'); | ||
|  |         changes.check(m); | ||
|  | 
 | ||
|  |         var f = 'f'; | ||
|  |         var oo = 'oo'; | ||
|  |         var b = 'b'; | ||
|  |         var ar = 'ar'; | ||
|  | 
 | ||
|  |         MapWrapper.set(m, f + oo, b + ar); | ||
|  |         changes.check(m); | ||
|  | 
 | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['foo'], | ||
|  |           previous: ['foo'] | ||
|  |         })); | ||
|  |       }); | ||
|  | 
 | ||
|  |       it('should not see a NaN value as a change (JS)', () => { | ||
|  |         MapWrapper.set(m, 'foo', NumberWrapper.NaN); | ||
|  |         changes.check(m); | ||
|  | 
 | ||
|  |         changes.check(m); | ||
|  |         expect(changes.toString()).toEqual(changesAsString({ | ||
|  |           map: ['foo'], | ||
|  |           previous: ['foo'] | ||
|  |         })); | ||
|  |       }); | ||
|  |     }); | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | function changesAsString({map, previous, additions, changes, removals}) { | ||
|  |   if (isBlank(map)) map = []; | ||
|  |   if (isBlank(previous)) previous = []; | ||
|  |   if (isBlank(additions)) additions = []; | ||
|  |   if (isBlank(changes)) changes = []; | ||
|  |   if (isBlank(removals)) removals = []; | ||
|  | 
 | ||
|  |   return "map: " + map.join(', ') + "\n" + | ||
|  |          "previous: " + previous.join(', ') + "\n" + | ||
|  |          "additions: " + additions.join(', ') + "\n" + | ||
|  |          "changes: " + changes.join(', ') + "\n" + | ||
|  |          "removals: " + removals.join(', ') + "\n"; | ||
|  | } |