Extract JavaScript UI framework functionality into dedicated testdrive-jsui capability while maintaining 100% functionality preservation and integrating JavaScript tests into the main Python test suite. Phase 1 (Foundation Setup) - COMPLETED: - Created capability directory structure with proper Python package layout - Configured pyproject.toml with Node.js subprocess dependencies - Set up package.json with Jest + JSDOM testing framework - Implemented Python-JavaScript bridge for seamless test integration - Created comprehensive capability Makefile with all testing targets - Added detailed README documentation for capability usage Phase 2 (Integration Layer) - COMPLETED: - Built Python test wrappers for JavaScript test execution via subprocess - Integrated with pytest discovery system for unified test experience - Added capability targets to main Makefile delegation system - Verified test integration works with main test suite Phase 3 (Safe Migration) - COMPLETED: - Copied (not moved) all JavaScript files to capability using safe copy-first approach - Migrated 4 core JavaScript components and 11 test files (2,840+ lines) - Verified all tests work in new location (11 Python tests + 7 JavaScript tests passing) - Maintained dual-track testing capability for safety during transition Phase 4 (Framework Enhancement) - COMPLETED: - Enhanced testing framework with Python integration and coverage reporting - Achieved 59% Python test coverage and 100% JavaScript test coverage - Added performance benchmarking and component documentation Phase 5 (Production Integration) - COMPLETED: - Added standard 'test' target to capability Makefile for discovery system compatibility - Integrated JavaScript tests into main Makefile with new targets: * test-js: Run JavaScript UI tests * test-all: Run all tests (Python + JavaScript + Capabilities) - Updated help documentation to include new testing workflows - Verified capability auto-discovery works via 'make test-capabilities' Key Achievements: - Zero-risk migration completed with copy-first safety approach - Full Python-JavaScript test integration with 18 total passing tests - JavaScript UI framework successfully extracted to dedicated capability - Enhanced CI/CD integration with unified test command interface - Clean architecture enabling future JavaScript framework evolution Testing Status: - ✅ All Python integration tests passing (11/11) - ✅ All JavaScript component tests passing (7/7) - ✅ Capability discovery integration working - ✅ Main test suite integration complete - ✅ Test coverage reporting functional (59% Python, 100% JavaScript) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
83 lines
2.6 KiB
JavaScript
83 lines
2.6 KiB
JavaScript
'use strict';
|
||
|
||
var keys = require('object-keys');
|
||
var map = require('array.prototype.map');
|
||
var define = require('define-properties');
|
||
|
||
var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
|
||
|
||
module.exports = function (values, t) {
|
||
var a = {};
|
||
var b = {};
|
||
var c = {};
|
||
var obj = { a: a, b: b, c: c };
|
||
|
||
t.deepEqual(values(obj), [a, b, c], 'basic support');
|
||
t.deepEqual(values({ a: a, b: a, c: c }), [a, a, c], 'duplicate values are included');
|
||
|
||
t.test('values are in the same order as keys', function (st) {
|
||
var object = { a: a, b: b };
|
||
object[0] = 3;
|
||
object.c = c;
|
||
object[1] = 4;
|
||
delete object[0];
|
||
var objKeys = keys(object);
|
||
var objValues = map(objKeys, function (key) {
|
||
return object[key];
|
||
});
|
||
st.deepEqual(values(object), objValues, 'values match key order');
|
||
st.end();
|
||
});
|
||
|
||
t.test('non-enumerable properties are omitted', { skip: !Object.defineProperty }, function (st) {
|
||
var object = { a: a, b: b };
|
||
Object.defineProperty(object, 'c', { enumerable: false, value: c });
|
||
st.deepEqual(values(object), [a, b], 'non-enumerable property‘s value is omitted');
|
||
st.end();
|
||
});
|
||
|
||
t.test('inherited properties are omitted', function (st) {
|
||
var F = function G() {};
|
||
F.prototype.a = a;
|
||
var f = new F();
|
||
f.b = b;
|
||
st.deepEqual(values(f), [b], 'only own properties are included');
|
||
st.end();
|
||
});
|
||
|
||
t.test('Symbol properties are omitted', { skip: !hasSymbols }, function (st) {
|
||
var object = { a: a, b: b, c: c };
|
||
var enumSym = Symbol('enum');
|
||
var nonEnumSym = Symbol('non enum');
|
||
object[enumSym] = enumSym;
|
||
object.d = enumSym;
|
||
Object.defineProperty(object, nonEnumSym, { enumerable: false, value: nonEnumSym });
|
||
st.deepEqual(values(object), [a, b, c, enumSym], 'symbol properties are omitted');
|
||
st.end();
|
||
});
|
||
|
||
t.test('not-yet-visited keys deleted on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) {
|
||
var o = { a: 1, b: 2, c: 3 };
|
||
Object.defineProperty(o, 'a', {
|
||
get: function () {
|
||
delete this.b;
|
||
return 1;
|
||
}
|
||
});
|
||
st.deepEqual(values(o), [1, 3], 'when "b" is deleted prior to being visited, it should not show up');
|
||
st.end();
|
||
});
|
||
|
||
t.test('not-yet-visited keys made non-enumerable on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) {
|
||
var o = { a: 'A', b: 'B' };
|
||
Object.defineProperty(o, 'a', {
|
||
get: function () {
|
||
Object.defineProperty(o, 'b', { enumerable: false });
|
||
return 'A';
|
||
}
|
||
});
|
||
st.deepEqual(values(o), ['A'], 'when "b" is made non-enumerable prior to being visited, it should not show up');
|
||
st.end();
|
||
});
|
||
};
|