Skip to main content
Glama
test-pedagogical-widget-context.js9.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);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rkm097git/euconquisto-composer-mcp-poc'

If you have feedback or need assistance with the MCP directory API, please join our Discord server