diff --git a/test/core-properties.js b/test/core-properties.js new file mode 100644 index 0000000..15b5cd5 --- /dev/null +++ b/test/core-properties.js @@ -0,0 +1,86 @@ +var x11 = require('../lib/x11'); +var should = require('should'); +var assert = require('assert'); + + // keep for a while: this snippet helps to track global leak + global.__defineSetter__('valueName', function(v) { + console.trace(); + }); + +describe('Window property', function() { + + var display; + var X; + var wid; + beforeEach(function(done) { + var client = x11.createClient(function(dpy) { + display=dpy; + X = display.client; + wid = X.AllocID(); + X.CreateWindow(wid, display.screen[0].root, 0, 0, 100, 100, 0, 0, 0, 0, { eventMask: x11.eventMask.PropertyChange}); + done(); + client.removeListener('error', done); // all future errors should be attached to corresponding test 'done' + }); + client.on('error', done); + }); + + afterEach(function(done) { + X.terminate(); + X.on('end', done); + X = null; + display = null; + }); + + it('shuld exist after set with ChangeProperty', function(done) { + X.on('error', done); + var propvalset = "some property value"; + X.ChangeProperty(0, wid, X.atoms.WM_NAME, X.atoms.STRING, 8, propvalset); + X.GetProperty(0, wid, X.atoms.WM_NAME, X.atoms.STRING, 0, 10000000, function(err, prop) { + if (err) return done(err); + var propvalget = prop.data.toString(); + assert.equal(propvalset, propvalget, 'get property result different from set property value'); + done(); + }); + }); + + it('should generate PropertyNotify event', function(done) { + X.on('error', done); + var propvalset = "some property value"; + X.ChangeProperty(0, wid, X.atoms.WM_NAME, X.atoms.STRING, 8, propvalset); + X.on('event', function(ev) { + if (ev.name === 'PropertyNotify') + { + assert.equal(ev.atom, X.atoms.WM_NAME, 'atom in notification should be same as in ChangeProperty'); + // TODO: replace 0 with X.PropertyNewValue + assert.equal(ev.state, 0, 'atom in notification should be same as in ChangeProperty'); + assert.equal(ev.window, wid, 'window in notification should be same as in ChangeProperty'); + done(); + return; + } + done('unexpexted event'); + }); + }); + + it('should not exist after DeleteProperty called', function(done) { + X.on('error', done); + var propvalset = "some property value"; + X.ChangeProperty(0, wid, X.atoms.WM_NAME, X.atoms.STRING, 8, propvalset); + X.GetProperty(0, wid, X.atoms.WM_NAME, X.atoms.STRING, 0, 10000000, function(err, prop) { + if (err) return done(err); + var propvalget = prop.data.toString(); + assert.equal(propvalset, propvalget, 'get property result different from set property value'); + X.DeleteProperty(wid, X.atoms.WM_NAME); + X.GetProperty(0, wid, X.atoms.WM_NAME, X.atoms.STRING, 0, 10000000, function(err, prop) { + assert.equal(prop.type, 0, 'non-existent property type should be 0'); + assert.equal(prop.data.length, 0, 'non-existent property data length should be 0'); + done(); + }); + }); + }); + + it('should exist in the ListProperties result after inserted'); + it('should not exist after GetProperty with delete flag called'); + //it('should not exist after GetProperty with delete flag called', function(done) { + // done(); + //}); +});