1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* globals: beforeEach, describe, it, module, inject, expect */
describe('RecursionHelper', function(){
    var $compile, parent, scope, link;
 
    angular.module('Tree', []).directive("tree", function(RecursionHelper){
        return {
            restrict: "E",
            scope: {
                family: '='
            },
            replace: true,
            template: '' +
                '<div class="tree">' +
                '    <p>{{ family.name }}</p>' +
                '    <ul>' +
                '        <li ng-repeat="child in family.children">' +
                '            <tree family="child"></tree>' +
                '        </li>' +
                '    </ul>' +
                '</div>',
            compile: function(element){
                return RecursionHelper.compile(element, link);
            }
        };
    });
 
    beforeEach(module('RecursionHelper', 'Tree'));
    beforeEach(inject(function(_$compile_, $rootScope){
        $compile = _$compile_;
        scope = $rootScope.$new();
        scope.treeFamily = {
            name: "Parent",
            children: [
                {
                    name: "Child1",
                    children: [
                        {
                            name: "Grandchild1",
                            children: []
                        },
                        {
                            name: "Grandchild2",
                            children: []
                        },
                        {
                            name: "Grandchild3",
                            children: []
                        }
                    ]
                },
                {
                    name: "Child2",
                    children: []
                }
            ]
        };
    }));
 
    function compileTree(){
        parent = $compile('<tree family="treeFamily"></tree>')(scope);
        scope.$apply();
    }
 
 
       it('should render the whole tree', function(){
        compileTree();
        var children = parent.children('ul').children();
        var grandChildren = children.find(':first-child').children('ul').children();
        expect(children.length).toBe(2);
        expect(grandChildren.length).toBe(3);
    });
 
    it('should call the pre and post linking functions, when passed as object in the link parameter', function(){
        link = {
            pre: jasmine.createSpy('pre'),
            post: jasmine.createSpy('post')
        };
 
        compileTree();
        expect(link.pre).toHaveBeenCalled();
        expect(link.post).toHaveBeenCalled();
 
    });
 
    it('should call the post linking function, when passed as function in the link parameter', function(){
        link = jasmine.createSpy('post');
 
        compileTree();
        expect(link).toHaveBeenCalled();
    });
});