TypeRunner est un compilateur TypeScript optimisé pour la performance, doté d’un système de tests rigoureux qui couvre à la fois la correction fonctionnelle et l’efficacité d’exécution. Ce système repose sur une architecture modulaire incluant des tests unitaires, des tests d’intégration et des benchmarks de performance.
Architecture du framwork de test
Le code de test réside dans le répertoire src/tests/ et s’appuie principalement sur Google Test (gtest) pour les composants C++. Il est structuré en trois niveaux :
- Tests unitaires : validation fine des composants internes (inférence de types, gestion mémoire, machine virtuelle).
- Tests d’intégration : vérification du bon fonctionnement global du pipeline de compilation.
- Benchmarks de performance : mesures comparatives de vitesse de compilation et d’exécution.
Tests unitaires détaillés
Les tests unitaires ciblent chaque sous-système critique :
test_core.cpp: logique centrale du compilateur.test_newtypes.cpp: vérification des règles d’inférence et de compatibilité de types.test_vm2_*.cpp: comportement de la machine virtuelle avec fonctions, classes, fermetures et unions.test_pool_*.cpp: efficacité des stratégies d’allocation mémoire via pools spécialisés.
Benchmarks de performance
Le framework intègre des outils dédiés à l’évaluation quantitative :
test_bench.cppcontient des scénarios de compilation JIT mesurés via des macros gtest.bench.cppexécute un cycle complet : compilation → génération de bytecode → exécution, avec chronométrage précis.- Le script
tests/bench.tscompare automatiquement les temps d’exécution entre TypeRunner ettsc(le compilateur officiel de TypeScript).
Cas de test représentatifs
Les fichiers TypeScript dans tests/ couvrent un spectre large de fonctionnalités :
basic1.ts: déclarations de types simples.basicError1.ts: détection d’erreurs de typage.big1.ts,big2.ts: manipulation de grandes unions de types.generic2.ts: inférence et contraintes génériques.function1.ts: signatures complexes et résolution de surcharge.
Procédure d’exécution des tests
- Compilation : ```
mkdir build && cd build
cmake ..
make
- Exécution des tests unitaires : ```
./test_runner --gtest_filter="*"
- Lancement d’un benchmark : ```
./bench ../tests/basic1.ts
- Comparaison avec tsc : ```
node tests/bench.ts tests/basic1.ts
Fonctionnalités avancées du framework
Le système de test intègre plusieurs capacités au-delà de la simple validation :
- Interface de débogage visuelle : affichage simultané du code source, du bytecode généré, de l’état de la VM et des métriques de performance.
- Validation de la gestion mémoire : tests spécifiques aux pools (
pool_array,pool_band, etc.) et à l’efficacité du ramasse-miettes. - Couverture exhaustive du système de types : y compris les types conditionnels distributifs, les contraintes génériques et les cas limites (
never,any, types vides).
Recommandations pour les développeurs
Pour tirer pleinement parti du framework :
- Réutiliser ou étendre les cas existants dans
tests/. - Mesurer systématiquement les performances avec la macro
BENCH(). - Valider non seulement la justesse des résultats, mais aussi leur stabilité sous charge.
- Tester séparément les chemins « froids » (première compilation) et « chauds » (exécution depuis cache).