michael@0: _("Make sure notify sends out the right notifications"); michael@0: Cu.import("resource://services-sync/util.js"); michael@0: michael@0: function run_test() { michael@0: let ret, rightThis, didCall; michael@0: let obj = { michael@0: notify: Utils.notify("foo:"), michael@0: _log: { michael@0: trace: function() {} michael@0: }, michael@0: michael@0: func: function() this.notify("bar", "baz", function() { michael@0: rightThis = this == obj; michael@0: didCall = true; michael@0: return 5; michael@0: })(), michael@0: michael@0: throwy: function() this.notify("bad", "one", function() { michael@0: rightThis = this == obj; michael@0: didCall = true; michael@0: throw 10; michael@0: })() michael@0: }; michael@0: michael@0: let state = 0; michael@0: let makeObs = function(topic) { michael@0: let obj = { michael@0: observe: function(subject, topic, data) { michael@0: this.state = ++state; michael@0: this.subject = subject; michael@0: this.topic = topic; michael@0: this.data = data; michael@0: } michael@0: }; michael@0: michael@0: Svc.Obs.add(topic, obj); michael@0: return obj; michael@0: }; michael@0: michael@0: _("Make sure a normal call will call and return with notifications"); michael@0: rightThis = didCall = false; michael@0: let fs = makeObs("foo:bar:start"); michael@0: let ff = makeObs("foo:bar:finish"); michael@0: let fe = makeObs("foo:bar:error"); michael@0: ret = obj.func(); michael@0: do_check_eq(ret, 5); michael@0: do_check_true(rightThis); michael@0: do_check_true(didCall); michael@0: michael@0: do_check_eq(fs.state, 1); michael@0: do_check_eq(fs.subject, undefined); michael@0: do_check_eq(fs.topic, "foo:bar:start"); michael@0: do_check_eq(fs.data, "baz"); michael@0: michael@0: do_check_eq(ff.state, 2); michael@0: do_check_eq(ff.subject, 5); michael@0: do_check_eq(ff.topic, "foo:bar:finish"); michael@0: do_check_eq(ff.data, "baz"); michael@0: michael@0: do_check_eq(fe.state, undefined); michael@0: do_check_eq(fe.subject, undefined); michael@0: do_check_eq(fe.topic, undefined); michael@0: do_check_eq(fe.data, undefined); michael@0: michael@0: _("Make sure a throwy call will call and throw with notifications"); michael@0: ret = null; michael@0: rightThis = didCall = false; michael@0: let ts = makeObs("foo:bad:start"); michael@0: let tf = makeObs("foo:bad:finish"); michael@0: let te = makeObs("foo:bad:error"); michael@0: try { michael@0: ret = obj.throwy(); michael@0: do_throw("throwy should have thrown!"); michael@0: } michael@0: catch(ex) { michael@0: do_check_eq(ex, 10); michael@0: } michael@0: do_check_eq(ret, null); michael@0: do_check_true(rightThis); michael@0: do_check_true(didCall); michael@0: michael@0: do_check_eq(ts.state, 3); michael@0: do_check_eq(ts.subject, undefined); michael@0: do_check_eq(ts.topic, "foo:bad:start"); michael@0: do_check_eq(ts.data, "one"); michael@0: michael@0: do_check_eq(tf.state, undefined); michael@0: do_check_eq(tf.subject, undefined); michael@0: do_check_eq(tf.topic, undefined); michael@0: do_check_eq(tf.data, undefined); michael@0: michael@0: do_check_eq(te.state, 4); michael@0: do_check_eq(te.subject, 10); michael@0: do_check_eq(te.topic, "foo:bad:error"); michael@0: do_check_eq(te.data, "one"); michael@0: }