summaryrefslogtreecommitdiffstats
path: root/spec/strict.js
blob: 2aef134423243379154297d48219b85b56babab2 (plain)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
var Exception = Handlebars.Exception;

describe('strict', function() {
  describe('strict mode', function() {
    it('should error on missing property lookup', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{hello}}', {strict: true});

        template({});
      }, Exception, /"hello" not defined in/);
    });
    it('should error on missing child', function() {
      var template = CompilerContext.compile('{{hello.bar}}', {strict: true});
      equals(template({hello: {bar: 'foo'}}), 'foo');

      shouldThrow(function() {
        template({hello: {}});
      }, Exception, /"bar" not defined in/);
    });
    it('should handle explicit undefined', function() {
      var template = CompilerContext.compile('{{hello.bar}}', {strict: true});

      equals(template({hello: {bar: undefined}}), '');
    });
    it('should error on missing property lookup in known helpers mode', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{hello}}', {strict: true, knownHelpersOnly: true});

        template({});
      }, Exception, /"hello" not defined in/);
    });
    it('should error on missing context', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{hello}}', {strict: true});

        template();
      }, Error);
    });

    it('should error on missing data lookup', function() {
      var template = CompilerContext.compile('{{@hello}}', {strict: true});
      equals(template(undefined, {data: {hello: 'foo'}}), 'foo');

      shouldThrow(function() {
        template();
      }, Error);
    });

    it('should not run helperMissing for helper calls', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{hello foo}}', {strict: true});

        template({foo: true});
      }, Exception, /"hello" not defined in/);

      shouldThrow(function() {
        var template = CompilerContext.compile('{{#hello foo}}{{/hello}}', {strict: true});

        template({foo: true});
      }, Exception, /"hello" not defined in/);
    });
    it('should throw on ambiguous blocks', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{#hello}}{{/hello}}', {strict: true});

        template({});
      }, Exception, /"hello" not defined in/);

      shouldThrow(function() {
        var template = CompilerContext.compile('{{^hello}}{{/hello}}', {strict: true});

        template({});
      }, Exception, /"hello" not defined in/);

      shouldThrow(function() {
        var template = CompilerContext.compile('{{#hello.bar}}{{/hello.bar}}', {strict: true});

        template({hello: {}});
      }, Exception, /"bar" not defined in/);
    });
  });

  describe('assume objects', function() {
    it('should ignore missing property', function() {
      var template = CompilerContext.compile('{{hello}}', {assumeObjects: true});

      equal(template({}), '');
    });
    it('should ignore missing child', function() {
      var template = CompilerContext.compile('{{hello.bar}}', {assumeObjects: true});

      equal(template({hello: {}}), '');
    });
    it('should error on missing object', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{hello.bar}}', {assumeObjects: true});

        template({});
      }, Error);
    });
    it('should error on missing context', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{hello}}', {assumeObjects: true});

        template();
      }, Error);
    });

    it('should error on missing data lookup', function() {
      shouldThrow(function() {
        var template = CompilerContext.compile('{{@hello.bar}}', {assumeObjects: true});

        template();
      }, Error);
    });

    it('should execute blockHelperMissing', function() {
      var template = CompilerContext.compile('{{^hello}}foo{{/hello}}', {assumeObjects: true});

      equals(template({}), 'foo');
    });
  });
});