43
Integrated Language Definition Testing Lennart Kats Rob Vermaas Eelco Visser Delft University of Technology LogicBlox Delft University of Technology

Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Embed Size (px)

Citation preview

Page 1: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Integrated Language Definition Testing

Lennart KatsRob VermaasEelco Visser

Delft University of TechnologyLogicBloxDelft University of Technology

Page 2: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Language Workbenches

Page 3: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testing

“DOES THE TYPE CHECKER CATCH THIS?”

Page 4: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testing

“DOES THIS HYPERLINK POINT TO THE RIGHT PLACE?”

Page 5: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Syntax

Semantics IDE

parsingabstract syntaxsyntax error marking

type checkingcompilationinterpretationexecution

errors/warningsreference resolvingcontent completionrefactoringviews

Page 6: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

How to testlanguage services?

Page 7: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

IMPLEMENTFEATURE, TEST WITH

EXAMPLE DOESN’T WORK

CLOSE ENOUGH.DISCARD

TEST

Page 8: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

How can we systematically testlanguage definitions?

Page 9: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

General-Purpose Testing Tools?

Page 10: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

A Test Input

module Example function foo() { bar();} function bar() { }

Page 11: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Another Test Input

module Example function foo() { foo();} function bar() { }

Page 12: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

A Negative Test Case

module Example function foo() { baz();} function bar() { }

Page 13: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Automated Testing Infrastructure

Testinput

Testscript

Parser

Compiler

IDE + simple – language-specific script – limited expressiveness – boilerplate code – ...

Page 14: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Can we design a general solution for specifying

language tests?

Page 15: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Yes We Can

Generic test specification language

+

Parametrization

Page 16: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Language-ParametricTesting Language (LPTL)module my-tests

language mobl

test Cannot assign an integer to a string [[ module Example <test input> var s : String = 1; }]] 1 error

module Example function test() { var s : String = 1;}

Page 17: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

LPTL Opportunities

Expressiveness

Tool support

Page 18: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

LPTL Opportunities (1)

Module system

+

GUI Test Runner

Page 19: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

LPTL Opportunities (2)

IDE support for test

specifications

Page 20: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

LPTL Opportunities (3)

Immediate test

evaluation

Page 21: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

LPTL Opportunities (4)

IDE support for test inputs

Page 22: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

LPTL Opportunities (5)setup [[ module Example

imports stuff function test() { [[...]] }]]

test Cannot assign ... [[ var s : String = 1;]] 1 error

Reduced boilerplate

Page 23: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

LPTL Opportunities (6)

Wide set of test conditions

1 error

2 warnings

/expected here/

parse fails

complete ... to ...

resolve ... to ...

refactor ... to ...

build ...

run ...

Page 24: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testing Syntax (1)

test Proper declaration [[ var s : String = "a";]] parse

test Java-like declaration [[ String s = "a";]] parse fails

Page 25: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testing Syntax (2)

test Proper declaration [[ var s : String = "a";]] parse to VarDecl("s", _)

test Precedence [[ 3 + 1 * 2]] parse to [[ 3 + (1 * 2)]]

Page 26: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testing Error Markers

test Variable declaration [[ var s : String = "a";]] 0 errors

test Bad variable declaration [[ var s : String = 25;]] 1 error /wrong type/

Page 27: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testing Referencestest [[ module Example function foo() { bar(); } function bar() { }]] resolve ... to ...

test [[ module Example function foo() { [[bar]](); } function [[bar]]() { }]] resolve #1 to #2

Page 28: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testing Code Generation..?

test [[ function foo() { return 3; }]] build generate-javascript to [[ [[bar]](); function bar() { }]]

to [[ var foo = function foo() { return 3; };]]

Page 29: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

setup [[ application execution

function test() : Num { // init [[...]] }]]

test Arithmetic [[ return 1 + 1;]] run run-test to 2

Testing Execution

Page 30: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Implementation

Spoofax Testing Language

(spoofax.org)

Page 31: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Implementation Techniques

Language embedding

Dynamic instantiation of language services

Page 32: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Language Embedding:Syntax

module testslanguage mobl

test Java-like declaration [[ String s = "a";]] parse fails

123

Page 33: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Language Embedding: Semantics & IDE (1)

test A function call [[ function foo() { } fo|]]

Content complete

Mobl

Page 34: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Language Embedding: Semantics & IDE (2)

test A function call [[ function foo() { } notfoo();]]

No condition;error not expected

Mobl

Page 35: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Dynamic Language Service Instantiation

Mobl

Page 36: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Dynamic Language Service Instantiation

Language registry

Language consists of services

Services have functional interfaces

Page 37: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Testinput

Dynamic Language Service Instantiation

Completionservice

Language registry

Mobl language

Parser

“mobl”

Page 38: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Reflection

+ simple

+ no scripting required

+ IDE helps avoid errors

+ little boilerplate code

+ expressiveness

Page 39: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Conclusions

• General abstraction for language testing

• Explored opportunities in expressiveness and tool support

www.spoofax.org

Page 40: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

ADDITIONAL SLIDES

Page 41: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Related:Automatic Test Generation

• Generate tests from grammar

• Requires oracle

• Complementary to our approach

Page 42: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

Self-Application

language Spoofax-Testing

test Testing testing [[[ language Mobl test Testing [[ module y ]]]]]

Page 43: Integrated Language Definition Testing: Enabling Test-Driven Language Development (SPLASH 2012)

The Spoofax Language Workbench

• Integrated environment for language definition

• Define syntax, semantics, IDE

• Based on Eclipse

www.spoofax.org

[OOPSLA 2010]