From f3352e6d74a7320e9af008fdd22b9057002ee945 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Sat, 13 Aug 2011 23:00:03 -0400 Subject: [PATCH] Added VisibilityObjectFactoryFactory (#25) - This may be temporary, depending on the ultimate implementation. This is intended to ease into the refactoring. --- lib/VisibilityObjectFactoryFactory.js | 53 +++++++++++++++ test/VisibilityObjectFactoryFactoryTest.js | 78 ++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 lib/VisibilityObjectFactoryFactory.js create mode 100644 test/VisibilityObjectFactoryFactoryTest.js diff --git a/lib/VisibilityObjectFactoryFactory.js b/lib/VisibilityObjectFactoryFactory.js new file mode 100644 index 0000000..ff56d9f --- /dev/null +++ b/lib/VisibilityObjectFactoryFactory.js @@ -0,0 +1,53 @@ +/** + * Contains factory for visibility object factory + * + * Copyright (C) 2010 Mike Gerwitz + * + * This file is part of ease.js. + * + * ease.js is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * @author Mike Gerwitz + * @package core + */ + +// XXX: Tightly coupled +var util = require( __dirname + '/util' ), + + VisibilityObjectFactory = require( __dirname + '/VisibilityObjectFactory' ), + + FallbackVisibilityObjectFactory = + require( __dirname + '/FallbackVisibilityObjectFactory' ) +; + + +/** + * Responsible for instantiating the VisibilityObjectFactory appropriate for the + * runtime environment + * + * This prototype determines what class should be instantiated. If we are within + * an ECMAScript 5 environment, we can take full advantage of the standard + * visibility object implementation. Otherwise, we are unable to emulate proxies + * and must fall back on a less sophisticated implementation that sacrifices + * visibility support. + */ +exports.fromEnvironment = function() +{ + // if falling back, return fallback, otherwise standard + return ( util.definePropertyFallback() ) + ? FallbackVisibilityObjectFactory() + : VisibilityObjectFactory() + ; +}; + diff --git a/test/VisibilityObjectFactoryFactoryTest.js b/test/VisibilityObjectFactoryFactoryTest.js new file mode 100644 index 0000000..505ddb9 --- /dev/null +++ b/test/VisibilityObjectFactoryFactoryTest.js @@ -0,0 +1,78 @@ +/** + * Tests factory for visibility object factory + * + * Copyright (C) 2010 Mike Gerwitz + * + * This file is part of ease.js. + * + * ease.js is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * @author Mike Gerwitz + * @package test + */ + + +var common = require( './common' ), + assert = require( 'assert' ), + util = common.require( 'util' ), + + sut = common.require( 'VisibilityObjectFactoryFactory' ), + + VisibilityObjectFactory = common.require( 'VisibilityObjectFactory' ), + + FallbackVisibilityObjectFactory = + common.require( 'FallbackVisibilityObjectFactory' ) +; + + +/** + * By default, if supported by our environment, we should use the standard + * factory to provide proper visibility support. + */ +( function testReturnsStandardIfNotFallingBack() +{ + // don't bother with the test if we don't support the standard visibility + // object + if ( util.definePropertyFallback() ) + { + return; + } + + assert.ok( + ( sut.fromEnvironment() instanceof VisibilityObjectFactory ), + "Creates standard VisibilityObjectFactory if supported" + ); +} )(); + + +/** + * If not supported by our environment, we should be permitted to fall back to a + * working implementation that sacrifices visibility support. + */ +( function testReturnsFallbackFactoryIfFallingBack() +{ + var old = util.definePropertyFallback(); + + // force fallback + util.definePropertyFallback( true ); + + assert.ok( + ( sut.fromEnvironment() instanceof FallbackVisibilityObjectFactory ), + "Creates fallback VisibilityObjectFactory if falling back" + ); + + // restore fallback + util.definePropertyFallback( old ); +} )(); +