test-pedagogical-widget-context.js•9.01 kB
#!/usr/bin/env node
/**
* Test Pedagogical Widget Context Module v1.0.0
* Validates pedagogical widget context for educational appropriateness
* Tests token efficiency and coverage
*/
import {
PEDAGOGICAL_WIDGET_CONTEXT,
GRADE_LEVEL_CONTEXT,
SUBJECT_WIDGET_PREFERENCES,
WIDGET_SELECTION_GUIDANCE,
TOKEN_EFFICIENCY_SUMMARY
} from '../../src/config/pedagogical-widget-context.js';
async function testPedagogicalWidgetContext() {
console.log('🧪 Testing Pedagogical Widget Context Module v1.0.0');
console.log('📋 Validates educational appropriateness and token efficiency');
console.log('');
let testsPassed = 0;
let totalTests = 0;
// Test 1: Widget Context Coverage
console.log('📚 Test 1: Widget Context Coverage');
totalTests++;
const expectedWidgets = [
'head-1', 'text-1', 'text-2', 'text-3', 'text-4', 'text-5',
'quiz-1', 'quiz-2', 'quiz-3', 'flashcards-1', 'flashcards-2',
'image-1', 'image-2', 'images-gallery', 'image-and-text', 'image-with-text',
'list-1', 'list-2', 'list-3', 'accordion', 'tabs', 'timeline-1', 'steps-1',
'video-1', 'audio-1', 'table-1', 'hotspots-1', 'sorted-activity-1'
];
const contextWidgets = Object.keys(PEDAGOGICAL_WIDGET_CONTEXT);
const coverage = contextWidgets.length / expectedWidgets.length;
console.log(` Widget types covered: ${contextWidgets.length}/${expectedWidgets.length} (${Math.round(coverage * 100)}%)`);
console.log(` Missing widgets: ${expectedWidgets.filter(w => !contextWidgets.includes(w)).join(', ')}`);
if (coverage >= 0.8) {
console.log(' ✅ Good widget coverage (>80%)');
testsPassed++;
} else {
console.log(' ❌ Insufficient widget coverage (<80%)');
}
console.log('');
// Test 2: Token Efficiency
console.log('📊 Test 2: Token Efficiency');
totalTests++;
const maxTokensPerWidget = 50;
const tokenEfficiencyTests = Object.entries(PEDAGOGICAL_WIDGET_CONTEXT).map(([widget, context]) => {
const tokens = context.tokens || 0;
const efficient = tokens <= maxTokensPerWidget;
return { widget, tokens, efficient };
});
const efficientWidgets = tokenEfficiencyTests.filter(t => t.efficient).length;
const tokenEfficiency = efficientWidgets / tokenEfficiencyTests.length;
console.log(` Efficient widgets: ${efficientWidgets}/${tokenEfficiencyTests.length} (${Math.round(tokenEfficiency * 100)}%)`);
console.log(` Average tokens per widget: ${Math.round(tokenEfficiencyTests.reduce((sum, t) => sum + t.tokens, 0) / tokenEfficiencyTests.length)}`);
console.log(` Token inefficient widgets: ${tokenEfficiencyTests.filter(t => !t.efficient).map(t => `${t.widget}(${t.tokens})`).join(', ')}`);
if (tokenEfficiency >= 0.9) {
console.log(' ✅ Excellent token efficiency (>90%)');
testsPassed++;
} else {
console.log(' ❌ Poor token efficiency (<90%)');
}
console.log('');
// Test 3: Educational Quality
console.log('🎓 Test 3: Educational Quality');
totalTests++;
const requiredFields = ['educationalPurpose', 'pedagogicalContext', 'brasilianEducationAlignment', 'bnccConnection'];
const qualityTests = Object.entries(PEDAGOGICAL_WIDGET_CONTEXT).map(([widget, context]) => {
const hasAllFields = requiredFields.every(field => context[field] && context[field].length > 10);
const hasBnccAlignment = context.brasilianEducationAlignment && context.brasilianEducationAlignment.includes('BNCC');
return { widget, hasAllFields, hasBnccAlignment };
});
const qualityWidgets = qualityTests.filter(t => t.hasAllFields && t.hasBnccAlignment).length;
const qualityScore = qualityWidgets / qualityTests.length;
console.log(` Quality compliant widgets: ${qualityWidgets}/${qualityTests.length} (${Math.round(qualityScore * 100)}%)`);
console.log(` Missing fields: ${qualityTests.filter(t => !t.hasAllFields).map(t => t.widget).join(', ')}`);
console.log(` Missing BNCC alignment: ${qualityTests.filter(t => !t.hasBnccAlignment).map(t => t.widget).join(', ')}`);
if (qualityScore >= 0.95) {
console.log(' ✅ Excellent educational quality (>95%)');
testsPassed++;
} else {
console.log(' ❌ Educational quality needs improvement (<95%)');
}
console.log('');
// Test 4: Grade Level Context
console.log('📖 Test 4: Grade Level Context');
totalTests++;
const expectedGrades = ['6º ano', '7º ano', '8º ano', '9º ano', '1º médio', '2º médio', '3º médio', 'Superior'];
const gradesCovered = Object.keys(GRADE_LEVEL_CONTEXT);
const gradeCoverage = gradesCovered.length / expectedGrades.length;
console.log(` Grade levels covered: ${gradesCovered.length}/${expectedGrades.length} (${Math.round(gradeCoverage * 100)}%)`);
console.log(` Missing grades: ${expectedGrades.filter(g => !gradesCovered.includes(g)).join(', ')}`);
if (gradeCoverage >= 1.0) {
console.log(' ✅ Complete grade level coverage (100%)');
testsPassed++;
} else {
console.log(' ❌ Incomplete grade level coverage (<100%)');
}
console.log('');
// Test 5: Subject Coverage
console.log('🔬 Test 5: Subject Coverage');
totalTests++;
const expectedSubjects = ['Ciências', 'Física', 'Química', 'Biologia', 'Matemática', 'História', 'Geografia', 'Português', 'Inglês'];
const subjectsCovered = Object.keys(SUBJECT_WIDGET_PREFERENCES);
const subjectCoverage = subjectsCovered.length / expectedSubjects.length;
console.log(` Subjects covered: ${subjectsCovered.length}/${expectedSubjects.length} (${Math.round(subjectCoverage * 100)}%)`);
console.log(` Missing subjects: ${expectedSubjects.filter(s => !subjectsCovered.includes(s)).join(', ')}`);
if (subjectCoverage >= 0.9) {
console.log(' ✅ Excellent subject coverage (>90%)');
testsPassed++;
} else {
console.log(' ❌ Subject coverage needs improvement (<90%)');
}
console.log('');
// Test 6: Widget Selection Guidance
console.log('🎯 Test 6: Widget Selection Guidance');
totalTests++;
const guidanceKeys = Object.keys(WIDGET_SELECTION_GUIDANCE);
const expectedGuidanceKeys = ['contentTypeMapping', 'engagementPrinciples', 'qualityPrinciples'];
const guidanceComplete = expectedGuidanceKeys.every(key => guidanceKeys.includes(key));
console.log(` Guidance sections: ${guidanceKeys.join(', ')}`);
console.log(` Content types mapped: ${Object.keys(WIDGET_SELECTION_GUIDANCE.contentTypeMapping || {}).length}`);
console.log(` Engagement principles: ${Object.keys(WIDGET_SELECTION_GUIDANCE.engagementPrinciples || {}).length}`);
console.log(` Quality principles: ${Object.keys(WIDGET_SELECTION_GUIDANCE.qualityPrinciples || {}).length}`);
if (guidanceComplete) {
console.log(' ✅ Complete widget selection guidance');
testsPassed++;
} else {
console.log(' ❌ Incomplete widget selection guidance');
}
console.log('');
// Test 7: Token Efficiency Summary
console.log('⚡ Test 7: Token Efficiency Summary');
totalTests++;
const summaryKeys = Object.keys(TOKEN_EFFICIENCY_SUMMARY);
const expectedSummaryKeys = ['totalTokens', 'averageTokensPerWidget', 'efficiency', 'usage', 'benefit'];
const summaryComplete = expectedSummaryKeys.every(key => summaryKeys.includes(key));
const totalTokens = TOKEN_EFFICIENCY_SUMMARY.totalTokens || 0;
const averageTokens = TOKEN_EFFICIENCY_SUMMARY.averageTokensPerWidget || 0;
const efficiency = TOKEN_EFFICIENCY_SUMMARY.efficiency;
console.log(` Total tokens: ${totalTokens}`);
console.log(` Average tokens per widget: ${averageTokens}`);
console.log(` Efficiency rating: ${efficiency}`);
console.log(` Token efficiency: ${totalTokens < 1500 ? 'Excellent' : totalTokens < 2000 ? 'Good' : 'Needs improvement'}`);
if (summaryComplete && totalTokens < 1500) {
console.log(' ✅ Excellent token efficiency summary');
testsPassed++;
} else {
console.log(' ❌ Token efficiency summary needs improvement');
}
console.log('');
// Final Results
console.log('📊 Final Test Results');
console.log(` Tests passed: ${testsPassed}/${totalTests} (${Math.round(testsPassed/totalTests * 100)}%)`);
console.log('');
if (testsPassed === totalTests) {
console.log('🎉 SUCCESS: Pedagogical Widget Context Module is excellent!');
console.log(' ✅ Complete widget coverage with educational quality');
console.log(' ✅ Token-efficient design suitable for LLM integration');
console.log(' ✅ Comprehensive Brazilian education alignment');
console.log(' ✅ Ready for semantic widget classification implementation');
} else {
console.log('⚠️ PARTIAL SUCCESS: Some improvements needed');
console.log(` ${testsPassed} tests passed, ${totalTests - testsPassed} tests failed`);
}
return {
testsPassed,
totalTests,
success: testsPassed === totalTests
};
}
// Run the test
testPedagogicalWidgetContext().catch(console.error);