summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorTim Hatch <tim@timhatch.com>2015-10-13 11:34:10 -0700
committerTim Hatch <tim@timhatch.com>2015-10-13 11:34:10 -0700
commitfe5643e7d13809ca6eae7ec7e95c03bea6012226 (patch)
treeeb9cdcfe0a2dadff5a76f4bcc96acb2a72a1f160 /tests
parent483deba6920adf5c56a318acffb88c890656bc70 (diff)
parent27e304015dc3882ddb59122e168765775fb0e014 (diff)
downloadpygments-fe5643e7d13809ca6eae7ec7e95c03bea6012226.tar.gz
Merged in hanachin/pygments-main/add-ruby-filename (pull request #450)
Add Gemfile to RubyLexer filenames
Diffstat (limited to 'tests')
-rw-r--r--tests/examplefiles/99_bottles_of_beer.chpl13
-rw-r--r--tests/examplefiles/ahcon.f340
-rw-r--r--tests/examplefiles/autoit_submit.au32
-rw-r--r--tests/examplefiles/eval.rs606
-rw-r--r--tests/examplefiles/example.ezt32
-rw-r--r--tests/examplefiles/example.jcl31
-rw-r--r--tests/examplefiles/example.mac6
-rw-r--r--tests/examplefiles/example.scd76
-rw-r--r--tests/examplefiles/example.tf162
-rw-r--r--tests/examplefiles/example.ttl43
-rw-r--r--tests/examplefiles/example1.cadl149
-rw-r--r--tests/examplefiles/modula2_test_cases.def354
-rw-r--r--tests/examplefiles/robotframework_test.txt1
-rw-r--r--tests/examplefiles/rust_example.rs235
-rw-r--r--tests/examplefiles/test.adls313
-rw-r--r--tests/examplefiles/test.bpl140
-rw-r--r--tests/examplefiles/test.cadl32
-rw-r--r--tests/examplefiles/test.gradle20
-rw-r--r--tests/examplefiles/test.odin43
-rw-r--r--tests/examplefiles/test.psl182
-rw-r--r--tests/examplefiles/test2.odin30
-rw-r--r--tests/examplefiles/test_basic.adls28
-rw-r--r--tests/test_cmdline.py2
-rw-r--r--tests/test_lexers_other.py23
-rw-r--r--tests/test_shell.py26
-rw-r--r--tests/test_terminal_formatter.py51
26 files changed, 2700 insertions, 240 deletions
diff --git a/tests/examplefiles/99_bottles_of_beer.chpl b/tests/examplefiles/99_bottles_of_beer.chpl
index 47fcaaf6..3629028d 100644
--- a/tests/examplefiles/99_bottles_of_beer.chpl
+++ b/tests/examplefiles/99_bottles_of_beer.chpl
@@ -159,3 +159,16 @@ var wideOpen = 0o777,
clique_y = 0O660,
zeroOct = 0o0,
minPosOct = 0O1;
+
+private module M3 {
+ private proc foo() {
+
+ }
+
+ private iter bar() {
+
+ }
+
+ private var x: int;
+
+} \ No newline at end of file
diff --git a/tests/examplefiles/ahcon.f b/tests/examplefiles/ahcon.f
new file mode 100644
index 00000000..48ae920b
--- /dev/null
+++ b/tests/examplefiles/ahcon.f
@@ -0,0 +1,340 @@
+ SUBROUTINE AHCON (SIZE,N,M,A,B,OLEVR,OLEVI,CLEVR,CLEVI, TRUNCATED
+ & SCR1,SCR2,IPVT,JPVT,CON,WORK,ISEED,IERR) !Test inline comment
+C
+C FUNCTION:
+CF
+CF Determines whether the pair (A,B) is controllable and flags
+CF the eigenvalues corresponding to uncontrollable modes.
+CF this ad-hoc controllability calculation uses a random matrix F
+CF and computes whether eigenvalues move from A to the controlled
+CF system A+B*F.
+CF
+C USAGE:
+CU
+CU CALL AHCON (SIZE,N,M,A,B,OLEVR,OLEVI,CLEVR,CLEVI,SCR1,SCR2,IPVT,
+CU JPVT,CON,WORK,ISEED,IERR)
+CU
+CU since AHCON generates different random F matrices for each
+CU call, as long as iseed is not re-initialized by the main
+CU program, and since this code has the potential to be fooled
+CU by extremely ill-conditioned problems, the cautious user
+CU may wish to call it multiple times and rely, perhaps, on
+CU a 2-of-3 vote. We believe, but have not proved, that any
+CU errors this routine may produce are conservative--i.e., that
+CU it may flag a controllable mode as uncontrollable, but
+CU not vice-versa.
+CU
+C INPUTS:
+CI
+CI SIZE integer - first dimension of all 2-d arrays.
+CI
+CI N integer - number of states.
+CI
+CI M integer - number of inputs.
+CI
+CI A double precision - SIZE by N array containing the
+CI N by N system dynamics matrix A.
+CI
+CI B double precision - SIZE by M array containing the
+CI N by M system input matrix B.
+CI
+CI ISEED initial seed for random number generator; if ISEED=0,
+CI then AHCON will set ISEED to a legal value.
+CI
+C OUTPUTS:
+CO
+CO OLEVR double precision - N dimensional vector containing the
+CO real parts of the eigenvalues of A.
+CO
+CO OLEVI double precision - N dimensional vector containing the
+CO imaginary parts of the eigenvalues of A.
+CO
+CO CLEVR double precision - N dimensional vector work space
+CO containing the real parts of the eigenvalues of A+B*F,
+CO where F is the random matrix.
+CO
+CO CLEVI double precision - N dimensional vector work space
+CO containing the imaginary parts of the eigenvalues of
+CO A+B*F, where F is the random matrix.
+CO
+CO SCR1 double precision - N dimensional vector containing the
+CO magnitudes of the corresponding eigenvalues of A.
+CO
+CO SCR2 double precision - N dimensional vector containing the
+CO damping factors of the corresponding eigenvalues of A.
+CO
+CO IPVT integer - N dimensional vector; contains the row pivots
+CO used in finding the nearest neighbor eigenvalues between
+CO those of A and of A+B*F. The IPVT(1)th eigenvalue of
+CO A and the JPVT(1)th eigenvalue of A+B*F are the closest
+CO pair.
+CO
+CO JPVT integer - N dimensional vector; contains the column
+CO pivots used in finding the nearest neighbor eigenvalues;
+CO see IPVT.
+CO
+CO CON logical - N dimensional vector; flagging the uncontrollable
+CO modes of the system. CON(I)=.TRUE. implies the
+CO eigenvalue of A given by DCMPLX(OLEVR(IPVT(I)),OLEVI(IPVT(i)))
+CO corresponds to a controllable mode; CON(I)=.FALSE.
+CO implies an uncontrollable mode for that eigenvalue.
+CO
+CO WORK double precision - SIZE by N dimensional array containing
+CO an N by N matrix. WORK(I,J) is the distance between
+CO the open loop eigenvalue given by DCMPLX(OLEVR(I),OLEVI(I))
+CO and the closed loop eigenvalue of A+B*F given by
+CO DCMPLX(CLEVR(J),CLEVI(J)).
+CO
+CO IERR integer - IERR=0 indicates normal return; a non-zero
+CO value indicates trouble in the eigenvalue calculation.
+CO see the EISPACK and EIGEN documentation for details.
+CO
+C ALGORITHM:
+CA
+CA Calculate eigenvalues of A and of A+B*F for a randomly
+CA generated F, and see which ones change. Use a full pivot
+CA search through a matrix of euclidean distance measures
+CA between each pair of eigenvalues from (A,A+BF) to
+CA determine the closest pairs.
+CA
+C MACHINE DEPENDENCIES:
+CM
+CM NONE
+CM
+C HISTORY:
+CH
+CH written by: Birdwell & Laub
+CH date: May 18, 1985
+CH current version: 1.0
+CH modifications: made machine independent and modified for
+CH f77:bb:8-86.
+CH changed cmplx -> dcmplx: 7/27/88 jdb
+CH
+C ROUTINES CALLED:
+CC
+CC EIGEN,RAND
+CC
+C COMMON MEMORY USED:
+CM
+CM none
+CM
+C----------------------------------------------------------------------
+C written for: The CASCADE Project
+C Oak Ridge National Laboratory
+C U.S. Department of Energy
+C contract number DE-AC05-840R21400
+C subcontract number 37B-7685 S13
+C organization: The University of Tennessee
+C----------------------------------------------------------------------
+C THIS SOFTWARE IS IN THE PUBLIC DOMAIN
+C NO RESTRICTIONS ON ITS USE ARE IMPLIED
+C----------------------------------------------------------------------
+C
+C--global variables:
+C
+ INTEGER SIZE
+ INTEGER N
+ INTEGER M
+ INTEGER IPVT(1)
+ INTEGER JPVT(1)
+ INTEGER IERR
+C
+ DOUBLE PRECISION A(SIZE,N)
+ DOUBLE PRECISION B(SIZE,M)
+ DOUBLE PRECISION WORK(SIZE,N)
+ DOUBLE PRECISION CLEVR(N)
+ DOUBLE PRECISION CLEVI(N)
+ DOUBLE PRECISION OLEVR(N)
+ DOUBLE PRECISION OLEVI(N)
+ DOUBLE PRECISION SCR1(N)
+ DOUBLE PRECISION SCR2(N)
+C
+ LOGICAL CON(N)
+C
+C--local variables:
+C
+ INTEGER ISEED
+ INTEGER ITEMP
+ INTEGER K1
+ INTEGER K2
+ INTEGER I
+ INTEGER J
+ INTEGER K
+ INTEGER IMAX
+ INTEGER JMAX
+C
+ DOUBLE PRECISION VALUE
+ DOUBLE PRECISION EPS
+ DOUBLE PRECISION EPS1
+ DOUBLE PRECISION TEMP
+ DOUBLE PRECISION CURR
+ DOUBLE PRECISION ANORM
+ DOUBLE PRECISION BNORM
+ DOUBLE PRECISION COLNRM
+ DOUBLE PRECISION RNDMNO
+C
+ DOUBLE COMPLEX DCMPLX
+C
+C--compute machine epsilon
+C
+ EPS = 1.D0
+100 CONTINUE
+ EPS = EPS / 2.D0
+ EPS1 = 1.D0 + EPS
+ IF (EPS1 .NE. 1.D0) GO TO 100
+ EPS = EPS * 2.D0
+C
+C--compute the l-1 norm of a
+C
+ ANORM = 0.0D0
+ DO 120 J = 1, N
+ COLNRM = 0.D0
+ DO 110 I = 1, N
+ COLNRM = COLNRM + ABS(A(I,J))
+110 CONTINUE
+ IF (COLNRM .GT. ANORM) ANORM = COLNRM
+120 CONTINUE
+C
+C--compute the l-1 norm of b
+C
+ BNORM = 0.0D0
+ DO 140 J = 1, M
+ COLNRM = 0.D0
+ DO 130 I = 1, N
+ COLNRM = COLNRM + ABS(B(I,J))
+130 CONTINUE
+ IF (COLNRM .GT. BNORM) BNORM = COLNRM
+140 CONTINUE
+C
+C--compute a + b * f
+C
+ DO 160 J = 1, N
+ DO 150 I = 1, N
+ WORK(I,J) = A(I,J)
+150 CONTINUE
+160 CONTINUE
+C
+C--the elements of f are random with uniform distribution
+C--from -anorm/bnorm to +anorm/bnorm
+C--note that f is not explicitly stored as a matrix
+C--pathalogical floating point notes: the if (bnorm .gt. 0.d0)
+C--test should actually be if (bnorm .gt. dsmall), where dsmall
+C--is the smallest representable number whose reciprocal does
+C--not generate an overflow or loss of precision.
+C
+ IF (ISEED .EQ. 0) ISEED = 86345823
+ IF (ANORM .EQ. 0.D0) ANORM = 1.D0
+ IF (BNORM .GT. 0.D0) THEN
+ TEMP = 2.D0 * ANORM / BNORM
+ ELSE
+ TEMP = 2.D0
+ END IF
+ DO 190 K = 1, M
+ DO 180 J = 1, N
+ CALL RAND(ISEED,ISEED,RNDMNO)
+ VALUE = (RNDMNO - 0.5D0) * TEMP
+ DO 170 I = 1, N
+ WORK(I,J) = WORK(I,J) + B(I,K)*VALUE
+170 CONTINUE
+180 CONTINUE
+190 CONTINUE
+C
+C--compute the eigenvalues of a + b*f, and several other things
+C
+ CALL EIGEN (0,SIZE,N,WORK,CLEVR,CLEVI,WORK,SCR1,SCR2,IERR)
+ IF (IERR .NE. 0) RETURN
+C
+C--copy a so it is not destroyed
+C
+ DO 210 J = 1, N
+ DO 200 I = 1, N
+ WORK(I,J) = A(I,J)
+200 CONTINUE
+210 CONTINUE
+C
+C--compute the eigenvalues of a, and several other things
+C
+ CALL EIGEN (0,SIZE,N,WORK,OLEVR,OLEVI,WORK,SCR1,SCR2,IERR)
+ IF (IERR .NE. 0) RETURN
+C
+C--form the matrix of distances between eigenvalues of a and
+C--EIGENVALUES OF A+B*F
+C
+ DO 230 J = 1, N
+ DO 220 I = 1, N
+ WORK(I,J) =
+ & ABS(DCMPLX(OLEVR(I),OLEVI(I))-DCMPLX(CLEVR(J),CLEVI(J)))
+220 CONTINUE
+230 CONTINUE
+C
+C--initialize row and column pivots
+C
+ DO 240 I = 1, N
+ IPVT(I) = I
+ JPVT(I) = I
+240 CONTINUE
+C
+C--a little bit messy to avoid swapping columns and
+C--rows of work
+C
+ DO 270 I = 1, N-1
+C
+C--find the minimum element of each lower right square
+C--submatrix of work, for submatrices of size n x n
+C--through 2 x 2
+C
+ CURR = WORK(IPVT(I),JPVT(I))
+ IMAX = I
+ JMAX = I
+ TEMP = CURR
+C
+C--find the minimum element
+C
+ DO 260 K1 = I, N
+ DO 250 K2 = I, N
+ IF (WORK(IPVT(K1),JPVT(K2)) .LT. TEMP) THEN
+ TEMP = WORK(IPVT(K1),JPVT(K2))
+ IMAX = K1
+ JMAX = K2
+ END IF
+250 CONTINUE
+260 CONTINUE
+C
+C--update row and column pivots for indirect addressing of work
+C
+ ITEMP = IPVT(I)
+ IPVT(I) = IPVT(IMAX)
+ IPVT(IMAX) = ITEMP
+C
+ ITEMP = JPVT(I)
+ JPVT(I) = JPVT(JMAX)
+ JPVT(JMAX) = ITEMP
+C
+C--do next submatrix
+C
+270 CONTINUE
+C
+C--this threshold for determining when an eigenvalue has
+C--not moved, and is therefore uncontrollable, is critical,
+C--and may require future changes with more experience.
+C
+ EPS1 = SQRT(EPS)
+C
+C--for each eigenvalue pair, decide if it is controllable
+C
+ DO 280 I = 1, N
+C
+C--note that we are working with the "pivoted" work matrix
+C--and are looking at its diagonal elements
+C
+ IF (WORK(IPVT(I),JPVT(I))/ANORM .LE. EPS1) THEN
+ CON(I) = .FALSE.
+ ELSE
+ CON(I) = .TRUE.
+ END IF
+280 CONTINUE
+C
+C--finally!
+C
+ RETURN
+ END
diff --git a/tests/examplefiles/autoit_submit.au3 b/tests/examplefiles/autoit_submit.au3
index e5054dea..84fb7150 100644
--- a/tests/examplefiles/autoit_submit.au3
+++ b/tests/examplefiles/autoit_submit.au3
@@ -16,8 +16,10 @@ _IEFormElementOptionSelect ($oSelect, "S2", 1, "byText")
;options raido
_IEFormElementRadioSelect($oForm, "2nd", "type", 1, "byValue")
+#cs
ConsoleWrite(@Error)
Sleep(10000)
+#ce
_IEFormSubmit($oForm, 0)
_IELoadWait($oIE)
Sleep(60000)
diff --git a/tests/examplefiles/eval.rs b/tests/examplefiles/eval.rs
new file mode 100644
index 00000000..17e585a0
--- /dev/null
+++ b/tests/examplefiles/eval.rs
@@ -0,0 +1,606 @@
+// -------------------------------------------------------------------------------------------------
+// Rick, a Rust intercal compiler. Save your souls!
+//
+// Copyright (c) 2015 Georg Brandl
+//
+// This program is free software; you can redistribute it and/or modify it under the terms of the
+// GNU General Public License as published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
+// even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along with this program;
+// if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// -------------------------------------------------------------------------------------------------
+
+/// Interprets INTERCAL source.
+///
+/// The evaluator is used when rick is called with `-i`, or when the compiler generates
+/// the output while compiling (in the constant-output case).
+
+use std::fmt::{ Debug, Display };
+use std::io::Write;
+use std::u16;
+
+use err::{ Res, IE123, IE129, IE252, IE275, IE555, IE633, IE774, IE994 };
+use ast::{ self, Program, Stmt, StmtBody, ComeFrom, Expr, Var, VType };
+use stdops::{ Bind, Array, write_number, read_number, check_chance, check_ovf, pop_jumps,
+ get_random_seed, mingle, select, and_16, and_32, or_16, or_32, xor_16, xor_32 };
+
+
+/// Represents a value (either 16-bit or 32-bit) at runtime.
+#[derive(Clone, PartialEq, Eq, Debug)]
+pub enum Val {
+ I16(u16),
+ I32(u32),
+}
+
+impl Val {
+ /// Cast as a 16-bit value; returns an error if 32-bit and too big.
+ pub fn as_u16(&self) -> Res<u16> {
+ match *self {
+ Val::I16(v) => Ok(v),
+ Val::I32(v) => {
+ if v > (u16::MAX as u32) {
+ return IE275.err();
+ }
+ Ok(v as u16)
+ }
+ }
+ }
+
+ /// Cast as a 32-bit value; always succeeds.
+ pub fn as_u32(&self) -> u32 {
+ match *self {
+ Val::I16(v) => v as u32,
+ Val::I32(v) => v
+ }
+ }
+
+ /// Cast as an usize value; always succeeds.
+ pub fn as_usize(&self) -> usize {
+ self.as_u32() as usize
+ }
+
+ /// Create from a 32-bit value; will select the smallest possible type.
+ pub fn from_u32(v: u32) -> Val {
+ if v & 0xFFFF == v {
+ Val::I16(v as u16)
+ } else {
+ Val::I32(v)
+ }
+ }
+}
+
+/// The state of the interpreter's evaluator.
+pub struct Eval<'a> {
+ /// Program to execute.
+ program: &'a Program,
+ /// Stream to use for printing output.
+ stdout: &'a mut Write,
+ /// Whether to print debugging output during execution.
+ debug: bool,
+ /// Variable bindings for the four types of variables.
+ spot: Vec<Bind<u16>>,
+ twospot: Vec<Bind<u32>>,
+ tail: Vec<Bind<Array<u16>>>,
+ hybrid: Vec<Bind<Array<u32>>>,
+ /// The infamous NEXT stack, capable of holding 80 elements.
+ jumps: Vec<ast::LogLine>,
+ /// Abstain counter for each statement.
+ abstain: Vec<u32>,
+ /// Binary I/O "tape" state.
+ last_in: u8,
+ last_out: u8,
+ /// Random number generator state.
+ rand_st: u32,
+ /// Counts the number of executed statements.
+ stmt_ctr: usize,
+}
+
+/// Represents the control flow effect of an executed statement.
+enum StmtRes {
+ /// normal execution, next statement
+ Next,
+ /// jump around, from DO ... NEXT
+ Jump(usize),
+ /// jump back, from RESUME
+ Back(usize),
+ /// start from the first statement, from TRY AGAIN
+ FromTop,
+ /// end the program, from GIVE UP
+ End,
+}
+
+impl<'a> Eval<'a> {
+ /// Construct a new evaluator.
+ pub fn new(program: &'a Program, stdout: &'a mut Write, debug: bool,
+ random: bool) -> Eval<'a> {
+ let abs = program.stmts.iter().map(|stmt| stmt.props.disabled as u32).collect();
+ let nvars = (program.var_info.0.len(),
+ program.var_info.1.len(),
+ program.var_info.2.len(),
+ program.var_info.3.len());
+ Eval {
+ program: program,
+ stdout: stdout,
+ debug: debug,
+ spot: vec![Bind::new(0); nvars.0],
+ twospot: vec![Bind::new(0); nvars.1],
+ tail: vec![Bind::new(Array::empty()); nvars.2],
+ hybrid: vec![Bind::new(Array::empty()); nvars.3],
+ jumps: Vec::with_capacity(80),
+ rand_st: if random { get_random_seed() } else { 0 },
+ abstain: abs,
+ last_in: 0,
+ last_out: 0,
+ stmt_ctr: 0,
+ }
+ }
+
+ /// Interpret the program. Returns either the number of executed statements,
+ /// or an error (RtError).
+ pub fn eval(&mut self) -> Res<usize> {
+ let mut pctr = 0; // index of current statement
+ let program = self.program.clone();
+ let nstmts = program.stmts.len();
+ loop {
+ // check for falling off the end
+ if pctr >= nstmts {
+ // if the last statement was a TRY AGAIN, falling off the end is fine
+ if let StmtBody::TryAgain = program.stmts[program.stmts.len() - 1].body {
+ break;
+ }
+ return IE633.err();
+ }
+ self.stmt_ctr += 1;
+ let stmt = &program.stmts[pctr];
+ // execute statement if not abstained
+ if self.abstain[pctr] == 0 {
+ // check execution chance
+ let (passed, rand_st) = check_chance(stmt.props.chance, self.rand_st);
+ self.rand_st = rand_st;
+ if passed {
+ // try to eval this statement
+ let res = match self.eval_stmt(stmt) {
+ // on error, set the correct line number and bubble up
+ Err(mut err) => {
+ err.set_line(stmt.props.onthewayto);
+ // special treatment for NEXT
+ if let StmtBody::DoNext(n) = stmt.body {
+ if let Some(i) = program.labels.get(&n) {
+ err.set_line(program.stmts[*i as usize].props.srcline);
+ }
+ }
+ return Err(err);
+ }
+ Ok(res) => res
+ };
+ // handle control flow effects
+ match res {
+ StmtRes::Next => { }
+ StmtRes::Jump(n) => {
+ self.jumps.push(pctr as u16); // push the line with the NEXT
+ pctr = n;
+ continue; // do not increment or check for COME FROMs
+ }
+ StmtRes::Back(n) => {
+ pctr = n; // will be incremented below after COME FROM check
+ }
+ StmtRes::FromTop => {
+ pctr = 0; // start from the beginning, do not push any stack
+ continue;
+ }
+ StmtRes::End => break,
+ }
+ }
+ }
+ // if we are on the line with the compiler bug, error out
+ if pctr == self.program.bugline as usize {
+ return IE774.err_with(None, stmt.props.onthewayto);
+ }
+ // try to determine if we have to go to a COME FROM statement
+ // (note: in general, program.stmts[pctr] != stmt)
+ //
+ // the static COME FROM is always a possibility
+ let mut maybe_next = program.stmts[pctr].comefrom;
+ // the complicated case: evaluate all computed-come-from expressions
+ let my_label = program.stmts[pctr].props.label;
+ if program.uses_complex_comefrom && my_label > 0 {
+ for (i, stmt) in program.stmts.iter().enumerate() {
+ if let StmtBody::ComeFrom(ComeFrom::Expr(ref e)) = stmt.body {
+ let v = try!(try!(self.eval_expr(e)).as_u16());
+ if v == my_label {
+ // as soon as we have multiple candidates, we can bail out
+ if maybe_next.is_some() {
+ return IE555.err();
+ }
+ maybe_next = Some(i as u16);
+ }
+ }
+ }
+ }
+ // check for COME FROMs from this line
+ if let Some(next) = maybe_next {
+ let next = next as usize;
+ // check for abstained COME FROM
+ if self.abstain[next] == 0 {
+ // the COME FROM can also have a % chance
+ let (passed, rand_st) = check_chance(program.stmts[next].props.chance,
+ self.rand_st);
+ self.rand_st = rand_st;
+ if passed {
+ pctr = next;
+ continue;
+ }
+ }
+ }
+ // no COME FROM, normal execution
+ pctr += 1;
+ }
+ Ok(self.stmt_ctr)
+ }
+
+ /// Interpret a single statement.
+ fn eval_stmt(&mut self, stmt: &Stmt) -> Res<StmtRes> {
+ if self.debug {
+ println!("\nExecuting Stmt #{} (state before following)", self.stmt_ctr);
+ self.dump_state();
+ println!("{}", stmt);
+ }
+ match stmt.body {
+ StmtBody::Calc(ref var, ref expr) => {
+ let val = try!(self.eval_expr(expr));
+ try!(self.assign(var, val));
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Dim(ref var, ref exprs) => {
+ try!(self.array_dim(var, exprs));
+ Ok(StmtRes::Next)
+ }
+ StmtBody::DoNext(n) => {
+ match self.program.labels.get(&n) {
+ // too many jumps on stack already?
+ Some(_) if self.jumps.len() >= 80 => IE123.err(),
+ Some(i) => Ok(StmtRes::Jump(*i as usize)),
+ None => IE129.err(),
+ }
+ }
+ StmtBody::ComeFrom(_) => {
+ // nothing to do here at runtime
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Resume(ref expr) => {
+ let n = try!(self.eval_expr(expr)).as_u32();
+ // this expect() is safe: if the third arg is true, there will
+ // be no Ok(None) returns
+ let next = try!(pop_jumps(&mut self.jumps, n, true, 0))
+ .expect("https://xkcd.com/378/ ?!");
+ Ok(StmtRes::Back(next as usize))
+ }
+ StmtBody::Forget(ref expr) => {
+ let n = try!(self.eval_expr(expr)).as_u32();
+ try!(pop_jumps(&mut self.jumps, n, false, 0));
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Ignore(ref vars) => {
+ for var in vars {
+ self.set_rw(var, false);
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Remember(ref vars) => {
+ for var in vars {
+ self.set_rw(var, true);
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Stash(ref vars) => {
+ for var in vars {
+ self.stash(var);
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Retrieve(ref vars) => {
+ for var in vars {
+ try!(self.retrieve(var));
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Abstain(ref expr, ref whats) => {
+ let f: Box<Fn(u32) -> u32> = if let Some(ref e) = *expr {
+ let n = try!(self.eval_expr(e)).as_u32();
+ box move |v: u32| v.saturating_add(n)
+ } else {
+ box |_| 1
+ };
+ for what in whats {
+ self.abstain(what, &*f);
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::Reinstate(ref whats) => {
+ for what in whats {
+ self.abstain(what, &|v: u32| v.saturating_sub(1));
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::ReadOut(ref vars) => {
+ for var in vars {
+ match *var {
+ // read out whole array
+ Expr::Var(ref var) if var.is_dim() => {
+ try!(self.array_readout(var));
+ }
+ // read out single var or array element
+ Expr::Var(ref var) => {
+ let varval = try!(self.lookup(var));
+ try!(write_number(self.stdout, varval.as_u32(), 0));
+ }
+ // read out constant
+ Expr::Num(_, v) => try!(write_number(self.stdout, v, 0)),
+ // others will not be generated
+ _ => return IE994.err(),
+ };
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::WriteIn(ref vars) => {
+ for var in vars {
+ if var.is_dim() {
+ // write in whole array
+ try!(self.array_writein(var));
+ } else {
+ // write in single var or array element
+ let n = try!(read_number(0));
+ try!(self.assign(var, Val::from_u32(n)));
+ }
+ }
+ Ok(StmtRes::Next)
+ }
+ // this one is only generated by the constant-program optimizer
+ StmtBody::Print(ref s) => {
+ if let Err(_) = self.stdout.write(&s) {
+ return IE252.err();
+ }
+ Ok(StmtRes::Next)
+ }
+ StmtBody::TryAgain => Ok(StmtRes::FromTop),
+ StmtBody::GiveUp => Ok(StmtRes::End),
+ StmtBody::Error(ref e) => Err((*e).clone()),
+ }
+ }
+
+ /// Evaluate an expression to a value.
+ fn eval_expr(&self, expr: &Expr) -> Res<Val> {
+ match *expr {
+ Expr::Num(vtype, v) => match vtype {
+ VType::I16 => Ok(Val::I16(v as u16)),
+ VType::I32 => Ok(Val::I32(v)),
+ },
+ Expr::Var(ref var) => self.lookup(var),
+ Expr::Mingle(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx)).as_u32();
+ let w = try!(self.eval_expr(wx)).as_u32();
+ let v = try!(check_ovf(v, 0));
+ let w = try!(check_ovf(w, 0));
+ Ok(Val::I32(mingle(v, w)))
+ }
+ Expr::Select(vtype, ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ if vtype == VType::I16 {
+ Ok(Val::I16(select(v.as_u32(), try!(w.as_u16()) as u32) as u16))
+ } else {
+ Ok(Val::I32(select(v.as_u32(), w.as_u32())))
+ }
+ }
+ Expr::And(vtype, ref vx) => {
+ let v = try!(self.eval_expr(vx));
+ match vtype {
+ VType::I16 => Ok(Val::I16(and_16(try!(v.as_u16()) as u32) as u16)),
+ VType::I32 => Ok(Val::I32(and_32(v.as_u32()))),
+ }
+ }
+ Expr::Or(vtype, ref vx) => {
+ let v = try!(self.eval_expr(vx));
+ match vtype {
+ VType::I16 => Ok(Val::I16(or_16(try!(v.as_u16()) as u32) as u16)),
+ VType::I32 => Ok(Val::I32(or_32(v.as_u32()))),
+ }
+ }
+ Expr::Xor(vtype, ref vx) => {
+ let v = try!(self.eval_expr(vx));
+ match vtype {
+ VType::I16 => Ok(Val::I16(xor_16(try!(v.as_u16()) as u32) as u16)),
+ VType::I32 => Ok(Val::I32(xor_32(v.as_u32()))),
+ }
+ }
+ Expr::RsNot(ref vx) => {
+ let v = try!(self.eval_expr(vx));
+ Ok(Val::I32(!v.as_u32()))
+ }
+ Expr::RsAnd(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32(v.as_u32() & w.as_u32()))
+ }
+ Expr::RsOr(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32(v.as_u32() | w.as_u32()))
+ }
+ Expr::RsXor(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32(v.as_u32() ^ w.as_u32()))
+ }
+ Expr::RsRshift(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32(v.as_u32() >> w.as_u32()))
+ }
+ Expr::RsLshift(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32(v.as_u32() << w.as_u32()))
+ }
+ // Expr::RsEqual(ref vx, ref wx) => {
+ // let v = try!(self.eval_expr(vx));
+ // let w = try!(self.eval_expr(wx));
+ // Ok(Val::I32((v.as_u32() == w.as_u32()) as u32))
+ // }
+ Expr::RsNotEqual(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32((v.as_u32() != w.as_u32()) as u32))
+ }
+ Expr::RsPlus(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32(v.as_u32() + w.as_u32()))
+ }
+ Expr::RsMinus(ref vx, ref wx) => {
+ let v = try!(self.eval_expr(vx));
+ let w = try!(self.eval_expr(wx));
+ Ok(Val::I32(v.as_u32() - w.as_u32()))
+ }
+ }
+ }
+
+ #[inline]
+ fn eval_subs(&self, subs: &Vec<Expr>) -> Res<Vec<usize>> {
+ subs.iter().map(|v| self.eval_expr(v).map(|w| w.as_usize())).collect()
+ }
+
+ /// Dimension an array.
+ fn array_dim(&mut self, var: &Var, dims: &Vec<Expr>) -> Res<()> {
+ let dims = try!(self.eval_subs(dims));
+ match *var {
+ Var::A16(n, _) => self.tail[n].dimension(dims, 0),
+ Var::A32(n, _) => self.hybrid[n].dimension(dims, 0),
+ _ => return IE994.err(),
+ }
+ }
+
+ /// Assign to a variable.
+ fn assign(&mut self, var: &Var, val: Val) -> Res<()> {
+ match *var {
+ Var::I16(n) => Ok(self.spot[n].assign(try!(val.as_u16()))),
+ Var::I32(n) => Ok(self.twospot[n].assign(val.as_u32())),
+ Var::A16(n, ref subs) => {
+ let subs = try!(self.eval_subs(subs));
+ self.tail[n].set_md(subs, try!(val.as_u16()), 0)
+ }
+ Var::A32(n, ref subs) => {
+ let subs = try!(self.eval_subs(subs));
+ self.hybrid[n].set_md(subs, val.as_u32(), 0)
+ }
+ }
+ }
+
+ /// Look up the value of a variable.
+ fn lookup(&self, var: &Var) -> Res<Val> {
+ match *var {
+ Var::I16(n) => Ok(Val::I16(self.spot[n].val)),
+ Var::I32(n) => Ok(Val::I32(self.twospot[n].val)),
+ Var::A16(n, ref subs) => {
+ let subs = try!(self.eval_subs(subs));
+ self.tail[n].get_md(subs, 0).map(Val::I16)
+ }
+ Var::A32(n, ref subs) => {
+ let subs = try!(self.eval_subs(subs));
+ self.hybrid[n].get_md(subs, 0).map(Val::I32)
+ }
+ }
+ }
+
+ /// Process a STASH statement.
+ fn stash(&mut self, var: &Var) {
+ match *var {
+ Var::I16(n) => self.spot[n].stash(),
+ Var::I32(n) => self.twospot[n].stash(),
+ Var::A16(n, _) => self.tail[n].stash(),
+ Var::A32(n, _) => self.hybrid[n].stash(),
+ }
+ }
+
+ /// Process a RETRIEVE statement.
+ fn retrieve(&mut self, var: &Var) -> Res<()> {
+ match *var {
+ Var::I16(n) => self.spot[n].retrieve(0),
+ Var::I32(n) => self.twospot[n].retrieve(0),
+ Var::A16(n, _) => self.tail[n].retrieve(0),
+ Var::A32(n, _) => self.hybrid[n].retrieve(0),
+ }
+ }
+
+ /// Process an IGNORE or REMEMBER statement. Cannot fail.
+ fn set_rw(&mut self, var: &Var, rw: bool) {
+ match *var {
+ Var::I16(n) => self.spot[n].rw = rw,
+ Var::I32(n) => self.twospot[n].rw = rw,
+ Var::A16(n, _) => self.tail[n].rw = rw,
+ Var::A32(n, _) => self.hybrid[n].rw = rw,
+ }
+ }
+
+ /// P()rocess an ABSTAIN or REINSTATE statement. Cannot fail.
+ fn abstain(&mut self, what: &ast::Abstain, f: &Fn(u32) -> u32) {
+ if let &ast::Abstain::Label(lbl) = what {
+ let idx = self.program.labels[&lbl] as usize;
+ if self.program.stmts[idx].body != StmtBody::GiveUp {
+ self.abstain[idx] = f(self.abstain[idx]);
+ }
+ } else {
+ for (i, stype) in self.program.stmt_types.iter().enumerate() {
+ if stype == what {
+ self.abstain[i] = f(self.abstain[i]);
+ }
+ }
+ }
+ }
+
+ /// Array readout helper.
+ fn array_readout(&mut self, var: &Var) -> Res<()> {
+ let state = &mut self.last_out;
+ match *var {
+ Var::A16(n, _) => self.tail[n].readout(self.stdout, state, 0),
+ Var::A32(n, _) => self.hybrid[n].readout(self.stdout, state, 0),
+ _ => return IE994.err(),
+ }
+ }
+
+ /// Array writein helper.
+ fn array_writein(&mut self, var: &Var) -> Res<()> {
+ let state = &mut self.last_in;
+ match *var {
+ Var::A16(n, _) => self.tail[n].writein(state, 0),
+ Var::A32(n, _) => self.hybrid[n].writein(state, 0),
+ _ => return IE994.err(),
+ }
+ }
+
+ /// Debug helpers.
+ fn dump_state(&self) {
+ self.dump_state_one(&self.spot, ".");
+ self.dump_state_one(&self.twospot, ":");
+ self.dump_state_one(&self.tail, ",");
+ self.dump_state_one(&self.hybrid, ";");
+ if self.jumps.len() > 0 {
+ println!("Next stack: {:?}", self.jumps);
+ }
+ //println!("Abstained: {:?}", self.abstain);
+ }
+
+ fn dump_state_one<T: Debug + Display>(&self, vec: &Vec<Bind<T>>, sigil: &str) {
+ if vec.len() > 0 {
+ for (i, v) in vec.iter().enumerate() {
+ print!("{}{} = {}, ", sigil, i, v);
+ }
+ println!("");
+ }
+ }
+}
diff --git a/tests/examplefiles/example.ezt b/tests/examplefiles/example.ezt
new file mode 100644
index 00000000..fec2aa4c
--- /dev/null
+++ b/tests/examplefiles/example.ezt
@@ -0,0 +1,32 @@
+* Easytrieve Plus example programm.
+
+* Environtment section.
+PARM DEBUG(FLOW FLDCHK)
+
+* Library Section.
+FILE PERSNL FB(150 1800)
+ NAME 17 8 A
+ EMP# 9 5 N * Note: '#' is a valid character for names.
+ DEPT 98 3 N. GROSS 94 4 P 2
+ * ^ 2 field definitions in 1 line.
+
+* Call macro in example.mac.
+FILE EXAMPLE FB(80 200)
+%EXAMPLE SOMEFILE SOME
+
+* Activity Section.
+JOB INPUT PERSNL NAME FIRST-PROGRAM START AT-START FINISH AT_FINISH
+ PRINT PAY-RPT
+REPORT PAY-RPT LINESIZE 80
+ TITLE 01 'PERSONNEL REPORT EXAMPLE-1'
+ LINE 01 DEPT NAME EMP# GROSS
+
+* Procedure declarations.
+AT-START. PROC
+ DISPLAY 'PROCESSING...'
+END-PROC
+
+AT-FINISH
+PROC
+ DISPLAY 'DONE.'
+END-PROC
diff --git a/tests/examplefiles/example.jcl b/tests/examplefiles/example.jcl
new file mode 100644
index 00000000..18d4ae37
--- /dev/null
+++ b/tests/examplefiles/example.jcl
@@ -0,0 +1,31 @@
+//IS198CPY JOB (PYGM-TEST-001),'PYGMENTS TEST JOB',
+// CLASS=L,MSGCLASS=X,TIME=(00,10)
+//* Copy 'OLDFILE' to 'NEWFILE'.
+//COPY01 EXEC PGM=IEBGENER
+//SYSPRINT DD SYSOUT=*
+//SYSUT1 DD DSN=OLDFILE,DISP=SHR
+//SYSUT2 DD DSN=NEWFILE,
+// DISP=(NEW,CATLG,DELETE),
+// SPACE=(CYL,(40,5),RLSE), Some comment
+// DCB=(LRECL=115,BLKSIZE=1150)
+//SYSIN DD DUMMY
+/*
+//* Test line continuation in strings.
+//CONT01 EXEC PGM=IEFBR14,PARM='THIS IS A LONG PARAMETER WITHIN APOST
+// ROPHES, CONTINUED IN COLUMN 15 OF THE NEXT RECORD'
+//* Sort a couple of lines and show the result in the job log.
+//SORT01 EXEC PGM=IEFBR14
+//SORTIN DD *
+spam
+eggs
+ham
+/*
+//SORTOUT DD SYSOUT=*
+/*
+//* Test line continuation with comment at end of line continued by a
+//* character at column 72 (in this case 'X').
+//STP4 EXEC PROC=BILLING,COND.PAID=((20,LT),EVEN),
+// COND.LATE=(60,GT,FIND),
+// COND.BILL=((20,GE),(30,LT,CHGE)) THIS STATEMENT CALLS THE X
+// BILLING PROCEDURE AND SPECIFIES RETURN CODE TESTS FOR THREEX
+// PROCEDURE STEPS.
diff --git a/tests/examplefiles/example.mac b/tests/examplefiles/example.mac
new file mode 100644
index 00000000..1c3831d1
--- /dev/null
+++ b/tests/examplefiles/example.mac
@@ -0,0 +1,6 @@
+* Example Easytrieve macro declaration. For an example on calling this
+* macro, see example.ezt.
+MACRO FILENAME PREFIX
+&FILENAME.
+&PREFIX.-LINE 1 80 A
+&PREFIX.-KEY 1 8 A
diff --git a/tests/examplefiles/example.scd b/tests/examplefiles/example.scd
new file mode 100644
index 00000000..a27247e9
--- /dev/null
+++ b/tests/examplefiles/example.scd
@@ -0,0 +1,76 @@
+Instr("cs.fm.BasicFM", {
+ arg freq = 440,
+ amp = 0.9,
+ gate = 0,
+ carrierFreqRatio = 1.0,
+ modulatorFreqRatio = 1.0,
+ // not sure if having these defaults here actually does anything.
+ modEnvShape = Env.adsr(
+ attackTime: 0.05,
+ decayTime: 0.1,
+ sustainLevel: 0.5 * amp,
+ releaseTime: 0.1,
+ peakLevel: amp,
+ curve: [4, -4, -2]
+ ),
+ carrierEnvShape = Env.adsr(
+ attackTime: 0.05,
+ decayTime: 0.1,
+ sustainLevel: 0.5 * amp,
+ releaseTime: 0.1,
+ peakLevel: amp,
+ curve: [4, -4, -2]
+ );
+
+ var carrier,
+ modulator,
+ carrierEnv,
+ modEnv,
+ out;
+
+ modEnv = EnvGen.kr(
+ envelope: modEnvShape,
+ gate: gate
+ );
+
+ modulator = modEnv * SinOsc.ar(freq * modulatorFreqRatio);
+
+ // carrier sustains until noteoff
+ carrierEnvShape.releaseNode = 2;
+
+ carrierEnv = EnvGen.kr(
+ envelope: carrierEnvShape,
+ gate: gate
+ );
+
+ carrier = carrierEnv * SinOsc.ar(
+ (freq * carrierFreqRatio) + (modulator * freq)
+ );
+
+ // free synth when both carrier and modulator envelopes are done
+ FreeSelf.kr(Done.kr(carrierEnv) + Done.kr(modEnv) - 1);
+
+ out = amp * carrier;
+}, [
+ \freq.asSpec(),
+ \amp.asSpec(),
+ \nil,
+ ControlSpec(0.1, 10),
+ ControlSpec(0.1, 10),
+ EnvSpec(Env.adsr(
+ attackTime: 0.05,
+ decayTime: 0.1,
+ sustainLevel: 0.8,
+ releaseTime: 0.1,
+ peakLevel: 1.0,
+ curve: [4, -4, -2]
+ )),
+ EnvSpec(Env.adsr(
+ attackTime: 0.05,
+ decayTime: 0.1,
+ sustainLevel: 0.8,
+ releaseTime: 0.1,
+ peakLevel: 1.0,
+ curve: [4, -4, -2]
+ ))
+]);
diff --git a/tests/examplefiles/example.tf b/tests/examplefiles/example.tf
new file mode 100644
index 00000000..d3f02779
--- /dev/null
+++ b/tests/examplefiles/example.tf
@@ -0,0 +1,162 @@
+variable "key_name" {
+ description = "Name of the SSH keypair to use in AWS."
+}
+
+variable "key_path" {
+ description = "Path to the private portion of the SSH key specified."
+}
+
+variable "aws_region" {
+ description = "AWS region to launch servers."
+ default = "us-west-2"
+ somevar = true
+}
+
+# Ubuntu Precise 12.04 LTS (x64)
+variable "aws_amis" {
+ default = {
+ eu-west-1 = "ami-b1cf19c6"
+ us-east-1 = "ami-de7ab6b6"
+ us-west-1 = "ami-3f75767a"
+ us-west-2 = "ami-21f78e11"
+ }
+}
+
+
+
+
+
+
+provider "aws" {
+ access_key = "${myvar}"
+ secret_key = "your aws secret key"
+ region = "us-east-1"
+}
+/* multiline
+
+ comment
+
+*/
+
+
+# Single line comment
+resource "aws_instance" "example" {
+ ami = "ami-408c7f28"
+ instance_type = "t1.micro"
+ key_name = "your-aws-key-name"
+}
+
+# Create our Heroku application. Heroku will
+# automatically assign a name.
+resource "heroku_app" "web" {}
+
+# Create our DNSimple record to point to the
+# heroku application.
+resource "dnsimple_record" "web" {
+ domain = "${var.dnsimple_domain}"
+
+
+ # heroku_hostname is a computed attribute on the heroku
+ # application we can use to determine the hostname
+ value = "${heroku_app.web.heroku_hostname}"
+
+ type = "CNAME"
+ ttl = 3600
+}
+
+# The Heroku domain, which will be created and added
+# to the heroku application after we have assigned the domain
+# in DNSimple
+resource "heroku_domain" "foobar" {
+ app = "${heroku_app.web.name}"
+ hostname = "${dnsimple_record.web.hostname}"
+}
+
+
+# Specify the provider and access details
+provider "aws" {
+ region = "${var.aws_region}"
+ value = ${file("path.txt")}
+}
+
+# Our default security group to access
+# the instances over SSH and HTTP
+resource "aws_security_group" "default" {
+ name = "terraform_example"
+ description = "Used in the terraform"
+
+ # SSH access from anywhere
+ ingress {
+ from_port = 22
+ to_port = 22
+ protocol = "tcp"
+ cidr_blocks = ["0.0.0.0/0"]
+ }
+
+ # HTTP access from anywhere
+ ingress {
+ from_port = 80
+ to_port = 80
+ protocol = "tcp"
+ cidr_blocks = ["0.0.0.0/0"]
+ }
+}
+
+
+resource "aws_elb" "web" {
+ name = "terraform-example-elb"
+
+ # The same availability zone as our instance
+ availability_zones = ["${aws_instance.web.availability_zone}"]
+
+ listener {
+ instance_port = 80
+ instance_protocol = "http"
+ lb_port = 80
+ lb_protocol = "http"
+ }
+
+ # The instance is registered automatically
+ instances = ["${aws_instance.web.id}"]
+}
+
+
+resource "aws_instance" "web" {
+ # The connection block tells our provisioner how to
+ # communicate with the resource (instance)
+ connection {
+ # The default username for our AMI
+ user = "ubuntu"
+
+ # The path to your keyfile
+ key_file = "${var.key_path}"
+ }
+
+ instance_type = "m1.small"
+
+ # Lookup the correct AMI based on the region
+ # we specified
+ ami = "${lookup(var.aws_amis, var.aws_region)}"
+
+ # The name of our SSH keypair you've created and downloaded
+ # from the AWS console.
+ #
+ # https://console.aws.amazon.com/ec2/v2/home?region=us-west-2#KeyPairs:
+ #
+ key_name = "${var.key_name}"
+
+ # Our Security group to allow HTTP and SSH access
+ security_groups = ["${aws_security_group.default.name}"]
+
+ # We run a remote provisioner on the instance after creating it.
+ # In this case, we just install nginx and start it. By default,
+ # this should be on port 80
+ provisioner "remote-exec" {
+ inline = [
+ "sudo apt-get -y update",
+ "sudo apt-get -y install nginx",
+ "sudo service nginx start"
+ ]
+ }
+}
+
diff --git a/tests/examplefiles/example.ttl b/tests/examplefiles/example.ttl
new file mode 100644
index 00000000..e524d86c
--- /dev/null
+++ b/tests/examplefiles/example.ttl
@@ -0,0 +1,43 @@
+@base <http://example.com> .
+@prefix dcterms: <http://purl.org/dc/terms/>. @prefix xs: <http://www.w3.org/2001/XMLSchema> .
+@prefix mads: <http://www.loc.gov/mads/rdf/v1#> .
+@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
+@PREFIX dc: <http://purl.org/dc/elements/1.1/> # SPARQL-like syntax is OK
+@prefix : <http://xmlns.com/foaf/0.1/> . # empty prefix is OK
+
+<http://example.org/#spiderman> <http://www.perceive.net/schemas/relationship/enemyOf> <http://example.org/#green-goblin> .
+
+<#doc1> a <#document>
+ dc:creator "Smith", "Jones";
+ :knows <http://getopenid.com/jsmith>
+ dcterms:hasPart [ # A comment
+ dc:title "Some title", "Some other title";
+ dc:creator "برشت، برتولد"@ar;
+ dc:date "2009"^^xs:date
+ ];
+ dc:title "A sample title", 23.0;
+ dcterms:isPartOf [
+ dc:title "another", "title"
+ ] ;
+ :exists true .
+
+<http://data.ub.uio.no/realfagstermer/006839> a mads:Topic,
+ skos:Concept ;
+ dcterms:created "2014-08-25"^^xsd:date ;
+ dcterms:modified "2014-11-12"^^xsd:date ;
+ dcterms:identifier "REAL006839" ;
+ skos:prefLabel "Flerbørstemarker"@nb,
+ "Polychaeta"@la ;
+ skos:altLabel "Flerbørsteormer"@nb,
+ "Mangebørstemark"@nb,
+ "Mangebørsteormer"@nb,
+ "Havbørsteormer"@nb,
+ "Havbørstemarker"@nb,
+ "Polycheter"@nb.
+ skos:inScheme <http://data.ub.uio.no/realfagstermer/> ;
+ skos:narrower <http://data.ub.uio.no/realfagstermer/018529>,
+ <http://data.ub.uio.no/realfagstermer/024538>,
+ <http://data.ub.uio.no/realfagstermer/026723> ;
+ skos:exactMatch <http://ntnu.no/ub/data/tekord#NTUB17114>,
+ <http://dewey.info/class/592.62/e23/>,
+ <http://aims.fao.org/aos/agrovoc/c_29110> .
diff --git a/tests/examplefiles/example1.cadl b/tests/examplefiles/example1.cadl
new file mode 100644
index 00000000..3350fa3b
--- /dev/null
+++ b/tests/examplefiles/example1.cadl
@@ -0,0 +1,149 @@
+ --
+ -- Example fragment of an openEHR Archetype, written in cADL, a subsyntax of the Archetype Definition Language (ADL)
+ -- definition available here: http://www.openehr.org/releases/trunk/architecture/am/adl2.pdf
+ -- Author: Thomas Beale
+ --
+
+ EVALUATION[id1] matches { -- Adverse Reaction
+ data matches {
+ ITEM_TREE[id2] matches {
+ items cardinality matches {1..*; unordered} matches {
+ ELEMENT[id3] matches { -- Substance/Agent
+ value matches {
+ DV_TEXT[id51]
+ }
+ }
+ ELEMENT[id5] occurrences matches {0..1} matches { -- Absolute Contraindication?
+ value matches {
+ DV_BOOLEAN[id52] matches {
+ value matches {True}
+ }
+ }
+ }
+ ELEMENT[id50] occurrences matches {0..1} matches { -- Future Use
+ value matches {
+ DV_TEXT[id53]
+ }
+ }
+ ELEMENT[id7] occurrences matches {0..1} matches { -- Overall Comment
+ value matches {
+ DV_TEXT[id54]
+ }
+ }
+ CLUSTER[id10] matches { -- Reaction Event
+ items matches {
+ ELEMENT[id11] occurrences matches {0..1} matches { -- Specific Substance/Agent
+ value matches {
+ DV_TEXT[id55]
+ }
+ }
+ ELEMENT[id12] matches { -- Manifestation
+ value matches {
+ DV_TEXT[id56]
+ }
+ }
+ ELEMENT[id17] occurrences matches {0..1} matches { -- Reaction Type
+ value matches {
+ DV_TEXT[id57]
+ }
+ }
+ ELEMENT[id22] occurrences matches {0..1} matches { -- Certainty
+ value matches {
+ DV_CODED_TEXT[id58] matches {
+ defining_code matches {[ac1]} -- Certainty (synthesised)
+ }
+ }
+ }
+ ELEMENT[id13] occurrences matches {0..1} matches { -- Reaction Description
+ value matches {
+ DV_TEXT[id59]
+ }
+ }
+ ELEMENT[id28] occurrences matches {0..1} matches { -- Onset of Reaction
+ value matches {
+ DV_DATE_TIME[id60]
+ }
+ }
+ ELEMENT[id29] occurrences matches {0..1} matches { -- Duration of Reaction
+ value matches {
+ DV_DURATION[id61]
+ }
+ }
+ allow_archetype CLUSTER[id30] matches { -- Additional Reaction Detail
+ include
+ archetype_id/value matches {/openEHR-EHR-CLUSTER\.anatomical_location(-a-zA-Z0-9_]+)*\.v1/}
+ }
+ ELEMENT[id19] occurrences matches {0..1} matches { -- Exposure Description
+ value matches {
+ DV_TEXT[id62]
+ }
+ }
+ ELEMENT[id21] occurrences matches {0..1} matches { -- Earliest Exposure
+ value matches {
+ DV_DATE_TIME[id63]
+ }
+ }
+ ELEMENT[id26] occurrences matches {0..1} matches { -- Duration of Exposure
+ value matches {
+ DV_DURATION[id64]
+ }
+ }
+ allow_archetype CLUSTER[id20] matches { -- Additional Exposure Detail
+ include
+ archetype_id/value matches {/openEHR-EHR-CLUSTER\.amount(-a-zA-Z0-9_]+)*\.v1|openEHR-EHR-CLUSTER\.medication_admin(-a-zA-Z0-9_]+)*\.v1|openEHR-EHR-CLUSTER\.timing(-a-zA-Z0-9_]+)*\.v1/}
+ }
+ ELEMENT[id41] occurrences matches {0..1} matches { -- Clinical Management Description
+ value matches {
+ DV_TEXT[id65]
+ }
+ }
+ ELEMENT[id32] matches { -- Multimedia
+ value matches {
+ DV_MULTIMEDIA[id66] matches {
+ media_type
+ }
+ }
+ }
+ allow_archetype CLUSTER[id42] matches { -- Reporting Details
+ include
+ archetype_id/value matches {/.*/}
+ }
+ ELEMENT[id33] occurrences matches {0..1} matches { -- Reaction Comment
+ value matches {
+ DV_TEXT[id67]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ protocol matches {
+ ITEM_TREE[id43] matches {
+ items matches {
+ ELEMENT[id45] occurrences matches {0..1} matches { -- Reaction Reported?
+ value matches {
+ DV_BOOLEAN[id68] matches {
+ value matches {True, False}
+ }
+ }
+ }
+ ELEMENT[id49] occurrences matches {0..1} matches { -- Report Comment
+ value matches {
+ DV_TEXT[id69]
+ }
+ }
+ ELEMENT[id46] matches { -- Adverse Reaction Report
+ value matches {
+ DV_URI[id70]
+ }
+ }
+ ELEMENT[id48] occurrences matches {0..1} matches { -- Supporting Clinical Record Information
+ value matches {
+ DV_EHR_URI[id71]
+ }
+ }
+ }
+ }
+ }
+ }
diff --git a/tests/examplefiles/modula2_test_cases.def b/tests/examplefiles/modula2_test_cases.def
new file mode 100644
index 00000000..ce86a55b
--- /dev/null
+++ b/tests/examplefiles/modula2_test_cases.def
@@ -0,0 +1,354 @@
+(* Test Cases for Modula-2 Lexer *)
+
+(* Notes:
+ (1) Without dialect option nor embedded dialect tag, the lexer operates in
+ fallback mode, recognising the *combined* literals, punctuation symbols
+ and operators of all supported dialects, and the *combined* reserved
+ words and builtins of PIM Modula-2, ISO Modula-2 and Modula-2 R10.
+ (1) If multiple embedded dialect tags are present, the lexer will use the
+ first valid tag and ignore any subsequent dialect tags in the file.
+ (2) An embedded dialect tag overrides any command line dialect option. *)
+
+
+(* Testing command line dialect option *)
+
+(* for PIM Modula-2 : pygmentize -O full,dialect=m2pim ...
+ for ISO Modula-2 : pygmentize -O full,dialect=m2iso ...
+ for Modula-2 R10 : pygmentize -O full,dialect=m2r10 ...
+ for Objective Modula-2 : pygmentize -O full,dialect=objm2 ... *)
+
+(* for Aglet extensions : pygmentize -O full,dialect=m2iso+aglet ...
+ for GNU extensions : pygmentize -O full,dialect=m2pim+gm2 ...
+ for p1 extensions : pygmentize -O full,dialect=m2iso+p1 ...
+ for XDS extensions : pygmentize -O full,dialect=m2iso+xds ...
+
+
+(* Testing embedded dialect tags *)
+
+(* !m2pim*) (* <-- remove whitespace before ! for PIM Modula-2 *)
+(* !m2iso*) (* <-- remove whitespace before ! for ISO Modula-2 *)
+(* !m2r10*) (* <-- remove whitespace before ! for Modula-2 R10 *)
+(* !objm2*) (* <-- remove whitespace before ! for Objective Modula-2 *)
+
+(* !m2iso+aglet*) (* <-- remove whitespace before ! for Aglet extensions *)
+(* !m2pim+gm2*) (* <-- remove whitespace before ! for GNU extensions *)
+(* !m2iso+p1*) (* <-- remove whitespace before ! for p1 extensions *)
+(* !m2iso+xds*) (* <-- remove whitespace before ! for XDS extensions *)
+
+
+(* Dialect Indicating Names *)
+
+(* recognised names should be highlighted *)
+
+QUALIFIED (* PIM and ISO *)
+
+PACKEDSET (* ISO only *)
+
+ARGLIST (* M2 R10 and ObjM2 *)
+
+BYCOPY (* ObjM2 only *)
+
+BITSET8 (* Aglet, GNU and M2 R10 *)
+
+__FILE__ (* GNU only *)
+
+BCD (* p1 and M2 R10 *)
+
+SEQ (* XDS only *)
+
+
+(* Literal Tests *)
+
+(* recognised literals should be rendered as one unit
+ unrecognised literals should be rendered as error *)
+
+ch := 'a'; ch := "a"; (* all dialects *)
+ch := 0u20; unich := 0u2038 (* M2 R10 *)
+
+s := 'The cat said "meow!".';
+s := "It is eight O'clock.";
+
+
+n := 123; n = 1000000; (* all dialects *)
+n := 123; n = 1'000'000; (* M2 R10 *)
+
+n := 0b0110; n:= 0b0110'1100'0111; (* M2 R10 *)
+n := 0xFF00; n:= 0xDEAD'BEEF'0F00; (* M2 R10 *)
+
+r := 1.23; r := 1000000.000001; (* all dialects *)
+r := 1.23; r := 1'000'000.000'001; (* M2 R10 *)
+
+r := 1.234E6; r:= 1.234E-6; r := 1.234567E1000; (* PIM + ISO *)
+r := 1.234e6; r:= 1.234e-6; r := 1.234'567e1'000; (* M2 R10 *)
+
+ch := 0377C; n := 0377B; n := 07FF0H; (* ISO + PIM *)
+
+
+(* Non-Alphabetic Operator Tests *)
+
+(* supported operators should be rendered as one unit
+ unsupported operators should be rendered as errors *)
+
+a := b + c - d * e / f; (* all dialects *)
+
+SetDiff := A \ B; (* M2 R10 *)
+
+dotProduct := v1 *. v2; catArray := array1 +> array2; (* M2 R10 *)
+
+bool := a = b; bool := a > b; bool := a < b;
+bool := a # b; bool := a >= b; bool := a <= b;
+
+bool := a <> b; (* PIM + ISO *)
+
+bool := a == b; (* M2 R10 *)
+
+(*&*) IF a & b THEN ... END; (* PIM + ISO *)
+
+(*~*) IF ~ b THEN ... END; (* PIM + ISO *)
+
+(*::*) int := real :: INTEGER; (* M2 R10 *)
+
+(*++*) FOR i++ IN range DO ... END; (* M2 R10 *)
+(*--*) FOR i-- IN range DO ... END; (* M2 R10 *)
+
+(*^*) next := this^.next; (* all dialects *)
+(*@*) next := this@.next; (* ISO *)
+
+(*`*) str := `NSString alloc init; (* ObjM2 *)
+
+
+(* Punctuation Tests *)
+
+(* supported punctuation should be rendered as one unit
+ unsupported punctuation should be rendered as an error *)
+
+(*.*) Foo.Bar.Baz; (*..*) TYPE Sign = [-1..1] OF INTEGER;
+
+(*|:*) CASE foo OF | 1 : bar | 2 : bam | 3 : boo END;
+(*!:*) CASE foo OF 1 : bar ! 2 : bam ! 3 : boo END; (* ISO *)
+
+(*[]()*) array[n] := foo();
+
+(*{}*) CONST Bar = { 1, 2, 3 };
+
+(*?*) TPROPERTIES = isCollection, isIndexed | isRigid?; (* M2 R10 *)
+
+(*~*) CONST ~ isFoobar = Foo AND Bar; (* M2 R10 *)
+(*->*) isFoobar -> PROCEDURE [ABS]; (* M2 R10 *)
+
+(*<<>>*) GENLIB Foo FROM Template FOR Bar = <<ARRAY OF CHAR>> END; (* M2 R10 *)
+
+
+(* Single Line Comment Test *)
+
+(* should be rendered as comment if supported, as error if unsupported *)
+
+// This is a single line comment (M2 R10 + ObjM2)
+
+
+(* Pragma Delimiter Tests *)
+
+(* PIM style pragma should be rendered as pragma in PIM dialects,
+ as multiline comment in all other dialects. *)
+
+(*$INLINE*) (* PIM *)
+
+(* ISO style pragma should be rendered as error in PIM dialects,
+ as pragma in all other dialects. *)
+
+<*INLINE*> (* all other dialects *)
+
+
+(* Operator Substitution Test When in Algol mode *)
+
+IF foo # bar THEN ... END; (* # should be rendered as not equal symbol *)
+
+IF foo >= bar THEN ... END; (* >= should be rendered as not less symbol *)
+
+IF foo <= bar THEN ... END; (* <= should be rendered as not greater symbol *)
+
+IF foo == bar THEN ... END; (* == should be rendered as identity symbol *)
+
+dotProduct := v1 *. v2; (* *. should be rendered as dot product symbol *)
+
+
+(* Reserved Words and Builtins Test *)
+
+(* supported reserved words and builtins should be highlighted *)
+
+(* reserved words common to all dialects *)
+
+AND ARRAY BEGIN BY CASE CONST DEFINITION DIV DO ELSE ELSIF END EXIT FOR FROM
+IF IMPLEMENTATION IMPORT IN LOOP MOD MODULE NOT OF OR POINTER PROCEDURE
+RECORD REPEAT RETURN SET THEN TO TYPE UNTIL VAR WHILE
+
+(* builtins common to all dialects *)
+
+ABS BOOLEAN CARDINAL CHAR CHR FALSE INTEGER LONGINT LONGREAL
+MAX MIN NIL ODD ORD REAL TRUE
+
+(* pseudo builtins common to all dialects *)
+
+ADDRESS BYTE WORD ADR
+
+
+(* additional reserved words for PIM *)
+
+EXPORT QUALIFIED WITH
+
+(* additional builtins for PIM *)
+
+BITSET CAP DEC DISPOSE EXCL FLOAT HALT HIGH INC INCL NEW NIL PROC SIZE TRUNC VAL
+
+(* additional pseudo-builtins for PIM *)
+
+SYSTEM PROCESS TSIZE NEWPROCESS TRANSFER
+
+
+(* additional reserved words for ISO 10514-1 *)
+
+EXCEPT EXPORT FINALLY FORWARD PACKEDSET QUALIFIED REM RETRY WITH
+
+(* additional reserved words for ISO 10514-2 & ISO 10514-3 *)
+
+ABSTRACT AS CLASS GUARD INHERIT OVERRIDE READONLY REVEAL TRACED UNSAFEGUARDED
+
+(* additional builtins for ISO 10514-1 *)
+
+BITSET CAP CMPLX COMPLEX DEC DISPOSE EXCL FLOAT HALT HIGH IM INC INCL INT
+INTERRUPTIBLE LENGTH LFLOAT LONGCOMPLEX NEW PROC PROTECTION RE SIZE TRUNC
+UNINTERRUBTIBLE VAL
+
+(* additional builtins for ISO 10514-2 & ISO 10514-3 *)
+
+CREATE DESTROY EMPTY ISMEMBER SELF
+
+
+(* additional pseudo-builtins for ISO *)
+
+(* SYSTEM *)
+SYSTEM BITSPERLOC LOCSPERBYTE LOCSPERWORD LOC ADDADR SUBADR DIFADR MAKEADR
+ADR ROTATE SHIFT CAST TSIZE
+
+(* COROUTINES *)
+COROUTINES ATTACH COROUTINE CURRENT DETACH HANDLER INTERRUPTSOURCE IOTRANSFER
+IsATTACHED LISTEN NEWCOROUTINE PROT TRANSFER
+
+(* EXCEPTIONS *)
+EXCEPTIONS AllocateSource CurrentNumber ExceptionNumber ExceptionSource
+GetMessage IsCurrentSource IsExceptionalExecution RAISE
+
+(* TERMINATION *)
+TERMINATION IsTerminating HasHalted
+
+(* M2EXCEPTION *)
+M2EXCEPTION M2Exceptions M2Exception IsM2Exception indexException rangeException
+caseSelectException invalidLocation functionException wholeValueException
+wholeDivException realValueException realDivException complexValueException
+complexDivException protException sysException coException exException
+
+
+(* additional reserved words for M2 R10 *)
+
+ALIAS ARGLIST BLUEPRINT COPY GENLIB INDETERMINATE NEW NONE OPAQUE REFERENTIAL
+RELEASE RETAIN
+
+(* with symbolic assembler language extension *)
+ASM REG
+
+(* additional builtins for M2 R10 *)
+
+CARDINAL COUNT EMPTY EXISTS INSERT LENGTH LONGCARD OCTET PTR PRED READ READNEW
+REMOVE RETRIEVE SORT STORE SUBSET SUCC TLIMIT TMAX TMIN TRUE TSIZE UNICHAR
+WRITE WRITEF
+
+(* additional pseudo-builtins for M2 R10 *)
+
+(* TPROPERTIES *)
+TPROPERTIES PROPERTY LITERAL TPROPERTY TLITERAL TBUILTIN TDYN TREFC TNIL
+TBASE TPRECISION TMAXEXP TMINEXP
+
+(* CONVERSION *)
+CONVERSION TSXFSIZE SXF VAL
+
+(* UNSAFE *)
+UNSAFE CAST INTRINSIC AVAIL ADD SUB ADDC SUBC FETCHADD FETCHSUB SHL SHR ASHR
+ROTL ROTR ROTLC ROTRC BWNOT BWAND BWOR BWXOR BWNAND BWNOR SETBIT TESTBIT
+LSBIT MSBIT CSBITS BAIL HALT TODO FFI ADDR VARGLIST VARGC
+
+(* ATOMIC *)
+ATOMIC INTRINSIC AVAIL SWAP CAS INC DEC BWAND BWNAND BWOR BWXOR
+
+(* COMPILER *)
+COMPILER DEBUG MODNAME PROCNAME LINENUM DEFAULT HASH
+
+(* ASSEMBLER *)
+ASSEMBLER REGISTER SETREG GETREG CODE
+
+
+(* standard library ADT identifiers for M2 R10 *)
+
+(* rendered as builtins when dialect is set to Modula-2 R10,
+ this can be turned off by option treat_stdlib_adts_as_builtins=off *)
+BCD LONGBCD BITSET SHORTBITSET LONGBITSET LONGLONGBITSET COMPLEX LONGCOMPLEX
+SHORTCARD LONGLONGCARD SHORTINT LONGLONGINT POSINT SHORTPOSINT LONGPOSINT
+LONGLONGPOSINT BITSET8 BITSET16 BITSET32 BITSET64 BITSET128 BS8 BS16 BS32
+BS64 BS128 CARDINAL8 CARDINAL16 CARDINAL32 CARDINAL64 CARDINAL128 CARD8
+CARD16 CARD32 CARD64 CARD128 INTEGER8 INTEGER16 INTEGER32 INTEGER64
+INTEGER128 INT8 INT16 INT32 INT64 INT128 STRING UNISTRING
+
+
+(* additional reserved words for ObjM2 *)
+
+(* Note: ObjM2 is a superset of M2 R10 *)
+
+BYCOPY BYREF CLASS CONTINUE CRITICAL INOUT METHOD ON OPTIONAL OUT PRIVATE
+PROTECTED PROTOCOL PUBLIC SUPER TRY
+
+(* additional builtins for ObjM2 *)
+
+OBJECT NO YES
+
+
+(* additional builtins for Aglet Extensions to ISO *)
+
+BITSET8 BITSET16 BITSET32 CARDINAL8 CARDINAL16 CARDINAL32 INTEGER8 INTEGER16
+INTEGER32
+
+
+(* additional reserved words for GNU Extensions to PIM *)
+
+ASM __ATTRIBUTE__ __BUILTIN__ __COLUMN__ __DATE__ __FILE__ __FUNCTION__
+__LINE__ __MODULE__ VOLATILE
+
+(* additional builtins for GNU Extensions to PIM *)
+
+BITSET8 BITSET16 BITSET32 CARDINAL8 CARDINAL16 CARDINAL32 CARDINAL64 COMPLEX32
+COMPLEX64 COMPLEX96 COMPLEX128 INTEGER8 INTEGER16 INTEGER32 INTEGER64 REAL8
+REAL16 REAL32 REAL96 REAL128 THROW
+
+
+(* additional pseudo-builtins for p1 Extensions to ISO *)
+
+BCD
+
+
+(* additional reserved words for XDS Extensions to ISO *)
+
+SEQ
+
+(* additional builtins for XDS Extensions to ISO *)
+
+ASH ASSERT DIFFADR_TYPE ENTIER INDEX LEN LONGCARD SHORTCARD SHORTINT
+
+(* additional pseudo-builtins for XDS Extensions to ISO *)
+
+(* SYSTEM *)
+PROCESS NEWPROCESS BOOL8 BOOL16 BOOL32 CARD8 CARD16 CARD32 INT8 INT16 INT32
+REF MOVE FILL GET PUT CC int unsigned size_t void
+
+(* COMPILER *)
+COMPILER OPTION EQUATION
+
+
+(* end of file *) \ No newline at end of file
diff --git a/tests/examplefiles/robotframework_test.txt b/tests/examplefiles/robotframework_test.txt
index 63ba63e6..0d8179c0 100644
--- a/tests/examplefiles/robotframework_test.txt
+++ b/tests/examplefiles/robotframework_test.txt
@@ -6,6 +6,7 @@ Test Setup Keyword argument argument with ${VARIABLE}
*** Variables ***
${VARIABLE} Variable value
@{LIST} List variable here
+&{DICT} Key1=Value1 Key2=Value2
*** Test Cases ***
Keyword-driven example
diff --git a/tests/examplefiles/rust_example.rs b/tests/examplefiles/rust_example.rs
deleted file mode 100644
index 8c44af1d..00000000
--- a/tests/examplefiles/rust_example.rs
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// based on:
-// http://shootout.alioth.debian.org/u32/benchmark.php?test=nbody&lang=java
-
-/* nest some /* comments */ */
-
-extern mod std;
-
-use core::os;
-
-// Using sqrt from the standard library is way slower than using libc
-// directly even though std just calls libc, I guess it must be
-// because the the indirection through another dynamic linker
-// stub. Kind of shocking. Might be able to make it faster still with
-// an llvm intrinsic.
-#[nolink]
-extern mod libc {
- #![legacy_exports];
- fn sqrt(n: float) -> float;
-}
-
-fn main() {
- let args = os::args();
- let args = if os::getenv(~"RUST_BENCH").is_some() {
- ~[~"", ~"4000000"]
- } else if args.len() <= 1u {
- ~[~"", ~"100000"]
- } else {
- args
- };
- let n = int::from_str(args[1]).get();
- let mut bodies: ~[Body::props] = NBodySystem::make();
- io::println(fmt!("%f", NBodySystem::energy(bodies)));
- let mut i = 0;
- while i < n {
- NBodySystem::advance(bodies, 0.01);
- i += 1;
- }
- io::println(fmt!("%f", NBodySystem::energy(bodies)));
-}
-
-mod NBodySystem {
- use Body;
-
- pub fn make() -> ~[Body::props] {
- let mut bodies: ~[Body::props] =
- ~[Body::sun(),
- Body::jupiter(),
- Body::saturn(),
- Body::uranus(),
- Body::neptune()];
-
- let mut px = 0.0;
- let mut py = 0.0;
- let mut pz = 0.0;
-
- let mut i = 0;
- while i < 5 {
- px += bodies[i].vx * bodies[i].mass;
- py += bodies[i].vy * bodies[i].mass;
- pz += bodies[i].vz * bodies[i].mass;
-
- i += 1;
- }
-
- // side-effecting
- Body::offset_momentum(&mut bodies[0], px, py, pz);
-
- return bodies;
- }
-
- pub fn advance(bodies: &mut [Body::props], dt: float) {
- let mut i = 0;
- while i < 5 {
- let mut j = i + 1;
- while j < 5 {
- advance_one(&mut bodies[i],
- &mut bodies[j], dt);
- j += 1;
- }
-
- i += 1;
- }
-
- i = 0;
- while i < 5 {
- move_(&mut bodies[i], dt);
- i += 1;
- }
- }
-
- pub fn advance_one(bi: &mut Body::props,
- bj: &mut Body::props,
- dt: float) unsafe {
- let dx = bi.x - bj.x;
- let dy = bi.y - bj.y;
- let dz = bi.z - bj.z;
-
- let dSquared = dx * dx + dy * dy + dz * dz;
-
- let distance = ::libc::sqrt(dSquared);
- let mag = dt / (dSquared * distance);
-
- bi.vx -= dx * bj.mass * mag;
- bi.vy -= dy * bj.mass * mag;
- bi.vz -= dz * bj.mass * mag;
-
- bj.vx += dx * bi.mass * mag;
- bj.vy += dy * bi.mass * mag;
- bj.vz += dz * bi.mass * mag;
- }
-
- pub fn move_(b: &mut Body::props, dt: float) {
- b.x += dt * b.vx;
- b.y += dt * b.vy;
- b.z += dt * b.vz;
- }
-
- pub fn energy(bodies: &[Body::props]) -> float unsafe {
- let mut dx;
- let mut dy;
- let mut dz;
- let mut distance;
- let mut e = 0.0;
-
- let mut i = 0;
- while i < 5 {
- e +=
- 0.5 * bodies[i].mass *
- (bodies[i].vx * bodies[i].vx + bodies[i].vy * bodies[i].vy
- + bodies[i].vz * bodies[i].vz);
-
- let mut j = i + 1;
- while j < 5 {
- dx = bodies[i].x - bodies[j].x;
- dy = bodies[i].y - bodies[j].y;
- dz = bodies[i].z - bodies[j].z;
-
- distance = ::libc::sqrt(dx * dx + dy * dy + dz * dz);
- e -= bodies[i].mass * bodies[j].mass / distance;
-
- j += 1;
- }
-
- i += 1;
- }
- return e;
-
- }
-}
-
-mod Body {
- use Body;
-
- pub const PI: float = 3.141592653589793;
- pub const SOLAR_MASS: float = 39.478417604357432;
- // was 4 * PI * PI originally
- pub const DAYS_PER_YEAR: float = 365.24;
-
- pub type props =
- {mut x: float,
- mut y: float,
- mut z: float,
- mut vx: float,
- mut vy: float,
- mut vz: float,
- mass: float};
-
- pub fn jupiter() -> Body::props {
- return {mut x: 4.84143144246472090e+00,
- mut y: -1.16032004402742839e+00,
- mut z: -1.03622044471123109e-01,
- mut vx: 1.66007664274403694e-03 * DAYS_PER_YEAR,
- mut vy: 7.69901118419740425e-03 * DAYS_PER_YEAR,
- mut vz: -6.90460016972063023e-05 * DAYS_PER_YEAR,
- mass: 9.54791938424326609e-04 * SOLAR_MASS};
- }
-
- pub fn saturn() -> Body::props {
- return {mut x: 8.34336671824457987e+00,
- mut y: 4.12479856412430479e+00,
- mut z: -4.03523417114321381e-01,
- mut vx: -2.76742510726862411e-03 * DAYS_PER_YEAR,
- mut vy: 4.99852801234917238e-03 * DAYS_PER_YEAR,
- mut vz: 2.30417297573763929e-05 * DAYS_PER_YEAR,
- mass: 2.85885980666130812e-04 * SOLAR_MASS};
- }
-
- pub fn uranus() -> Body::props {
- return {mut x: 1.28943695621391310e+01,
- mut y: -1.51111514016986312e+01,
- mut z: -2.23307578892655734e-01,
- mut vx: 2.96460137564761618e-03 * DAYS_PER_YEAR,
- mut vy: 2.37847173959480950e-03 * DAYS_PER_YEAR,
- mut vz: -2.96589568540237556e-05 * DAYS_PER_YEAR,
- mass: 4.36624404335156298e-05 * SOLAR_MASS};
- }
-
- pub fn neptune() -> Body::props {
- return {mut x: 1.53796971148509165e+01,
- mut y: -2.59193146099879641e+01,
- mut z: 1.79258772950371181e-01,
- mut vx: 2.68067772490389322e-03 * DAYS_PER_YEAR,
- mut vy: 1.62824170038242295e-03 * DAYS_PER_YEAR,
- mut vz: -9.51592254519715870e-05 * DAYS_PER_YEAR,
- mass: 5.15138902046611451e-05 * SOLAR_MASS};
- }
-
- pub fn sun() -> Body::props {
- return {mut x: 0.0,
- mut y: 0.0,
- mut z: 0.0,
- mut vx: 0.0,
- mut vy: 0.0,
- mut vz: 0.0,
- mass: SOLAR_MASS};
- }
-
- pub fn offset_momentum(props: &mut Body::props,
- px: float, py: float, pz: float) {
- props.vx = -px / SOLAR_MASS;
- props.vy = -py / SOLAR_MASS;
- props.vz = -pz / SOLAR_MASS;
- }
-
-}
diff --git a/tests/examplefiles/test.adls b/tests/examplefiles/test.adls
new file mode 100644
index 00000000..1cdb2daf
--- /dev/null
+++ b/tests/examplefiles/test.adls
@@ -0,0 +1,313 @@
+--
+-- Example of an openEHR Archetype, written in the Archetype Definition Language (ADL)
+-- Definition available here: http://www.openehr.org/releases/trunk/architecture/am/adl2.pdf
+-- Author: derived from the openEHR-EHR-EVALUATION.adverse_reaction.v1 archetype at http://www.openEHR.org/ckm
+--
+
+archetype (adl_version=2.0.5; rm_release=1.0.2; generated)
+ openEHR-EHR-EVALUATION.adverse_reaction.v1.0.0
+
+language
+ original_language = <[ISO_639-1::en]>
+
+description
+ lifecycle_state = <"unmanaged">
+ original_author = <
+ ["name"] = <"Heather Leslie">
+ ["organisation"] = <"Ocean Informatics">
+ ["email"] = <"heather.leslie@oceaninformatics.com">
+ ["date"] = <"2010-11-08">
+ >
+ copyright = <"© openEHR Foundation">
+ details = <
+ ["en"] = <
+ language = <[ISO_639-1::en]>
+ purpose = <"To record information about any harmful...">
+ use = <"Use to record all information about the presence ...">
+ keywords = <"reaction", "allergy", "allergic", "adverse">
+ misuse = <"Not to be used for recording the absence (or ...">
+ >
+ >
+ other_contributors = <"Jane Doe, Australia">
+ other_details = <
+ ["references"] = <"Adverse Reaction, draft archetype, ...">
+ ["MD5-CAM-1.0.1"] = <"260699D2EFDE4F7C7BC3C6C501A51A61">
+ >
+
+definition
+ EVALUATION[id1] matches { -- Adverse Reaction
+ data matches {
+ ITEM_TREE[id2] matches {
+ items cardinality matches {1..*; unordered} matches {
+ ELEMENT[id3] matches { -- Substance/Agent
+ value matches {
+ DV_TEXT[id51]
+ }
+ }
+ ELEMENT[id5] occurrences matches {0..1} matches { -- Absolute Contraindication?
+ value matches {
+ DV_BOOLEAN[id52] matches {
+ value matches {True}
+ }
+ }
+ }
+ ELEMENT[id50] occurrences matches {0..1} matches { -- Future Use
+ value matches {
+ DV_TEXT[id53]
+ }
+ }
+ ELEMENT[id7] occurrences matches {0..1} matches { -- Overall Comment
+ value matches {
+ DV_TEXT[id54]
+ }
+ }
+ CLUSTER[id10] matches { -- Reaction Event
+ items matches {
+ ELEMENT[id11] occurrences matches {0..1} matches { -- Specific Substance/Agent
+ value matches {
+ DV_TEXT[id55]
+ }
+ }
+ ELEMENT[id12] matches { -- Manifestation
+ value matches {
+ DV_TEXT[id56]
+ }
+ }
+ ELEMENT[id17] occurrences matches {0..1} matches { -- Reaction Type
+ value matches {
+ DV_TEXT[id57]
+ }
+ }
+ ELEMENT[id22] occurrences matches {0..1} matches { -- Certainty
+ value matches {
+ DV_CODED_TEXT[id58] matches {
+ defining_code matches {[ac1]} -- Certainty (synthesised)
+ }
+ }
+ }
+ ELEMENT[id13] occurrences matches {0..1} matches { -- Reaction Description
+ value matches {
+ DV_TEXT[id59]
+ }
+ }
+ ELEMENT[id28] occurrences matches {0..1} matches { -- Onset of Reaction
+ value matches {
+ DV_DATE_TIME[id60]
+ }
+ }
+ ELEMENT[id29] occurrences matches {0..1} matches { -- Duration of Reaction
+ value matches {
+ DV_DURATION[id61]
+ }
+ }
+ allow_archetype CLUSTER[id30] matches { -- Additional Reaction Detail
+ include
+ archetype_id/value matches {/openEHR-EHR-CLUSTER\.anatomical_location(-a-zA-Z0-9_]+)*\.v1/}
+ }
+ ELEMENT[id19] occurrences matches {0..1} matches { -- Exposure Description
+ value matches {
+ DV_TEXT[id62]
+ }
+ }
+ ELEMENT[id21] occurrences matches {0..1} matches { -- Earliest Exposure
+ value matches {
+ DV_DATE_TIME[id63]
+ }
+ }
+ ELEMENT[id26] occurrences matches {0..1} matches { -- Duration of Exposure
+ value matches {
+ DV_DURATION[id64]
+ }
+ }
+ allow_archetype CLUSTER[id20] matches { -- Additional Exposure Detail
+ include
+ archetype_id/value matches {/openEHR-EHR-CLUSTER\.amount(-a-zA-Z0-9_]+)*\.v1|openEHR-EHR-CLUSTER\.medication_admin(-a-zA-Z0-9_]+)*\.v1|openEHR-EHR-CLUSTER\.timing(-a-zA-Z0-9_]+)*\.v1/}
+ }
+ ELEMENT[id41] occurrences matches {0..1} matches { -- Clinical Management Description
+ value matches {
+ DV_TEXT[id65]
+ }
+ }
+ ELEMENT[id32] matches { -- Multimedia
+ value matches {
+ DV_MULTIMEDIA[id66] matches {
+ media_type
+ }
+ }
+ }
+ allow_archetype CLUSTER[id42] matches { -- Reporting Details
+ include
+ archetype_id/value matches {/.*/}
+ }
+ ELEMENT[id33] occurrences matches {0..1} matches { -- Reaction Comment
+ value matches {
+ DV_TEXT[id67]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ protocol matches {
+ ITEM_TREE[id43] matches {
+ items matches {
+ ELEMENT[id45] occurrences matches {0..1} matches { -- Reaction Reported?
+ value matches {
+ DV_BOOLEAN[id68] matches {
+ value matches {True, False}
+ }
+ }
+ }
+ ELEMENT[id49] occurrences matches {0..1} matches { -- Report Comment
+ value matches {
+ DV_TEXT[id69]
+ }
+ }
+ ELEMENT[id46] matches { -- Adverse Reaction Report
+ value matches {
+ DV_URI[id70]
+ }
+ }
+ ELEMENT[id48] occurrences matches {0..1} matches { -- Supporting Clinical Record Information
+ value matches {
+ DV_EHR_URI[id71]
+ }
+ }
+ }
+ }
+ }
+ }
+
+terminology
+ term_definitions = <
+ ["en"] = <
+ ["id1"] = <
+ text = <"Adverse Reaction">
+ description = <"A harmful or undesirable, unexpected effect associated with exposure to any substance or agent, including food, plants, animals, venom from animal stings, or a medication at therapeutic or sub-therapeutic doses.">
+ >
+ ["id3"] = <
+ text = <"Substance/Agent">
+ description = <"Identification of a substance, agent, or a class of substance, that is considered to be responsible for the Adverse Reaction.">
+ >
+ ["id5"] = <
+ text = <"Absolute Contraindication?">
+ description = <"Is administration of this Substance/Agent absolutely contraindicated in this individual?">
+ >
+ ["id7"] = <
+ text = <"Overall Comment">
+ description = <"Additional narrative about the Adverse Reaction as a whole, not captured in other fields.">
+ >
+ ["id10"] = <
+ text = <"Reaction Event">
+ description = <"Details about each Adverse Reaction Event.">
+ >
+ ["id11"] = <
+ text = <"Specific Substance/Agent">
+ description = <"Specific identification of the actual Substance/Agent considered to be responsible for the Adverse Reaction event.">
+ >
+ ["id12"] = <
+ text = <"Manifestation">
+ description = <"Clinical manifestation of the Adverse Reaction expressed as a single word, phrase or brief description, e.g. nausea or rash.">
+ >
+ ["id13"] = <
+ text = <"Reaction Description">
+ description = <"Narrative description of the Adverse Reaction.">
+ >
+ ["id17"] = <
+ text = <"Reaction Type">
+ description = <"The type of Adverse Reaction as determined by the clinician.">
+ >
+ ["id19"] = <
+ text = <"Exposure Description">
+ description = <"Description about exposure to the Substance/Agent.">
+ >
+ ["id20"] = <
+ text = <"Additional Exposure Detail">
+ description = <"Additional detail about exposure/s for this Adverse Reaction event, including structured medication amount/frequency/route information.">
+ >
+ ["id21"] = <
+ text = <"Earliest Exposure">
+ description = <"Record of the date and/or time of the earliest or initial exposure to the Substance/Agent.">
+ >
+ ["id22"] = <
+ text = <"Certainty">
+ description = <"Degree of certainty, as assessed by a clinician, that the specific Substance/Agent was the cause of the Adverse Reaction.">
+ >
+ ["at23"] = <
+ text = <"Suspected">
+ description = <"Possibly the causative agent.">
+ >
+ ["at24"] = <
+ text = <"Probable">
+ description = <"Likely to be the causative agent, but not confirmed by testing or rechallenge.">
+ >
+ ["at25"] = <
+ text = <"Confirmed">
+ description = <"Confirmed as the causative agent, by testing or rechallenge.">
+ >
+ ["id26"] = <
+ text = <"Duration of Exposure">
+ description = <"The amount of time of exposure to the Substance/Agent.">
+ >
+ ["id28"] = <
+ text = <"Onset of Reaction">
+ description = <"Record of the date and/or time of the onset of the Adverse Reaction.">
+ >
+ ["id29"] = <
+ text = <"Duration of Reaction">
+ description = <"The amount of time that the Adverse Reaction was present.">
+ >
+ ["id30"] = <
+ text = <"Additional Reaction Detail">
+ description = <"Additional detail about the Adverse Reaction, including anatomical location.">
+ >
+ ["id32"] = <
+ text = <"Multimedia">
+ description = <"Inclusion of any multimedia file to support the recording of the Adverse Reaction event.">
+ >
+ ["id33"] = <
+ text = <"Reaction Comment">
+ description = <"Additional narrative about the Adverse Reaction event not captured in other fields.">
+ >
+ ["id41"] = <
+ text = <"Clinical Management Description">
+ description = <"Narrative description of the clinical management provided.">
+ >
+ ["id42"] = <
+ text = <"Reporting Details">
+ description = <"Further details required for reporting to regulatory bodies.">
+ >
+ ["id45"] = <
+ text = <"Reaction Reported?">
+ description = <"Was the Adverse Reaction reported to a regulatory body?">
+ >
+ ["id46"] = <
+ text = <"Adverse Reaction Report">
+ description = <"Link to an Adverse Reaction Report sent to a regulatory body.">
+ >
+ ["id48"] = <
+ text = <"Supporting Clinical Record Information">
+ description = <"Link to further information about the presentation and findings that exist elsewhere in the health record, including allergy test reports.">
+ >
+ ["id49"] = <
+ text = <"Report Comment">
+ description = <"Additional narrative about the Adverse Reaction Report, including the reason for non-reporting, if required.">
+ >
+ ["id50"] = <
+ text = <"Future Use">
+ description = <"Narrative description of clinician instructions or advice related to future exposure to, or administration of, the Substance/Agent.">
+ >
+ ["ac1"] = <
+ text = <"Certainty (synthesised)">
+ description = <"Degree of certainty, as assessed by a clinician, that the specific Substance/Agent was the cause of the Adverse Reaction. (synthesised)">
+ >
+ >
+ >
+ value_sets = <
+ ["ac1"] = <
+ id = <"ac1">
+ members = <"at23", "at24", "at25">
+ >
+ >
+
diff --git a/tests/examplefiles/test.bpl b/tests/examplefiles/test.bpl
new file mode 100644
index 00000000..add25e1a
--- /dev/null
+++ b/tests/examplefiles/test.bpl
@@ -0,0 +1,140 @@
+/*
+ * Test Boogie rendering
+*/
+
+const N: int;
+axiom 0 <= N;
+
+procedure foo() {
+ break;
+}
+// array to sort as global array, because partition & quicksort have to
+var a: [int] int;
+var original: [int] int;
+var perm: [int] int;
+
+// Is array a of length N sorted?
+function is_sorted(a: [int] int, l: int, r: int): bool
+{
+ (forall j, k: int :: l <= j && j < k && k <= r ==> a[j] <= a[k])
+}
+
+// is range a[l:r] unchanged?
+function is_unchanged(a: [int] int, b: [int] int, l: int, r: int): bool {
+ (forall i: int :: l <= i && i <= r ==> a[i] == b[i])
+}
+
+function is_permutation(a: [int] int, original: [int] int, perm: [int] int, N: int): bool
+{
+ (forall k: int :: 0 <= k && k < N ==> 0 <= perm[k] && perm[k] < N) &&
+ (forall k, j: int :: 0 <= k && k < j && j < N ==> perm[k] != perm[j]) &&
+ (forall k: int :: 0 <= k && k < N ==> a[k] == original[perm[k]])
+}
+
+function count(a: [int] int, x: int, N: int) returns (int)
+{ if N == 0 then 0 else if a[N-1] == x then count(a, x, N - 1) + 1 else count(a, x, N-1) }
+
+
+/*
+function count(a: [int] int, x: int, N: int) returns (int)
+{ if N == 0 then 0 else if a[N-1] == x then count(a, x, N - 1) + 1 else count(a, x, N-1) }
+
+function is_permutation(a: [int] int, b: [int] int, l: int, r: int): bool {
+ (forall i: int :: l <= i && i <= r ==> count(a, a[i], r+1) == count(b, a[i], r+1))
+}
+*/
+
+procedure partition(l: int, r: int, N: int) returns (p: int)
+ modifies a, perm;
+ requires N > 0;
+ requires l >= 0 && l < r && r < N;
+ requires ((r+1) < N) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] <= a[r+1]);
+ requires ((l-1) >= 0) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] > a[l-1]);
+
+ /* a is a permutation of the original array original */
+ requires is_permutation(a, original, perm, N);
+
+ ensures (forall k: int :: (k >= l && k <= p ) ==> a[k] <= a[p]);
+ ensures (forall k: int :: (k > p && k <= r ) ==> a[k] > a[p]);
+ ensures p >= l && p <= r;
+ ensures is_unchanged(a, old(a), 0, l-1);
+ ensures is_unchanged(a, old(a), r+1, N);
+ ensures ((r+1) < N) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] <= a[r+1]);
+ ensures ((l-1) >= 0) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] > a[l-1]);
+
+ /* a is a permutation of the original array original */
+ ensures is_permutation(a, original, perm, N);
+{
+ var i: int;
+ var sv: int;
+ var pivot: int;
+ var tmp: int;
+
+ i := l;
+ sv := l;
+ pivot := a[r];
+
+ while (i < r)
+ invariant i <= r && i >= l;
+ invariant sv <= i && sv >= l;
+ invariant pivot == a[r];
+ invariant (forall k: int :: (k >= l && k < sv) ==> a[k] <= old(a[r]));
+ invariant (forall k: int :: (k >= sv && k < i) ==> a[k] > old(a[r]));
+
+ /* a is a permutation of the original array original */
+ invariant is_permutation(a, original, perm, N);
+
+ invariant is_unchanged(a, old(a), 0, l-1);
+ invariant is_unchanged(a, old(a), r+1, N);
+ invariant ((r+1) < N) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] <= a[r+1]);
+ invariant ((l-1) >= 0) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] > a[l-1]);
+ {
+ if ( a[i] <= pivot) {
+ tmp := a[i]; a[i] := a[sv]; a[sv] := tmp;
+ tmp := perm[i]; perm[i] := perm[sv]; perm[sv] := tmp;
+ sv := sv +1;
+ }
+ i := i + 1;
+ }
+
+ //swap
+ tmp := a[i]; a[i] := a[sv]; a[sv] := tmp;
+ tmp := perm[i]; perm[i] := perm[sv]; perm[sv] := tmp;
+
+ p := sv;
+}
+
+
+procedure quicksort(l: int, r: int, N: int)
+ modifies a, perm;
+
+ requires N > 0;
+ requires l >= 0 && l < r && r < N;
+ requires ((r+1) < N) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] <= a[r+1]);
+ requires ((l-1) >= 0) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] > a[l-1]);
+
+ /* a is a permutation of the original array original */
+ requires is_permutation(a, original, perm, N);
+
+ ensures ((r+1) < N) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] <= a[r+1]);
+ ensures ((l-1) >= 0) ==> (forall k: int :: (k >= l && k <= r) ==> a[k] > a[l-1]);
+
+ ensures is_unchanged(a, old(a), 0, l-1);
+ ensures is_unchanged(a, old(a), r+1, N);
+ ensures is_sorted(a, l, r);
+
+ /* a is a permutation of the original array original */
+ ensures is_permutation(a, original, perm, N);
+{
+ var p: int;
+
+ call p := partition(l, r, N);
+
+ if ((p-1) > l) {
+ call quicksort(l, p-1, N);
+ }
+
+ if ((p+1) < r) {
+ call quicksort(p+1, r, N);
+ }
+}
diff --git a/tests/examplefiles/test.cadl b/tests/examplefiles/test.cadl
new file mode 100644
index 00000000..5c3f4881
--- /dev/null
+++ b/tests/examplefiles/test.cadl
@@ -0,0 +1,32 @@
+ --
+ -- Example fragment of an openEHR Archetype, written in cADL, a subsyntax of the Archetype Definition Language (ADL)
+ -- definition available here: http://www.openehr.org/releases/trunk/architecture/am/adl2.pdf
+ -- Author: Thomas Beale
+ --
+
+ EVALUATION[id1] matches { -- Adverse Reaction
+ data matches {
+ ITEM_TREE[id2] matches {
+ items cardinality matches {1..*; unordered} matches {
+ ELEMENT[id3] matches { -- Substance/Agent
+ value matches {
+ DV_TEXT[id51]
+ }
+ }
+ ELEMENT[id50] occurrences matches {0..1} matches { -- Future Use
+ value matches {
+ DV_TEXT[id53]
+ }
+ }
+ CLUSTER[id10] matches { -- Reaction Event
+ items matches {
+ allow_archetype CLUSTER[id30] matches { -- Additional Reaction Detail
+ include
+ archetype_id/value matches {/openEHR-EHR-CLUSTER\.anatomical_location(-a-zA-Z0-9_]+)*\.v1/}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
diff --git a/tests/examplefiles/test.gradle b/tests/examplefiles/test.gradle
new file mode 100644
index 00000000..0bc834c1
--- /dev/null
+++ b/tests/examplefiles/test.gradle
@@ -0,0 +1,20 @@
+apply plugin: 'java'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ testCompile 'junit:junit:4.12'
+}
+
+task sayHello << {
+ def x = SomeClass.worldString
+ println "Hello ${x}"
+}
+
+private class SomeClass {
+ public static String getWorldString() {
+ return "world"
+ }
+}
diff --git a/tests/examplefiles/test.odin b/tests/examplefiles/test.odin
new file mode 100644
index 00000000..05b01d22
--- /dev/null
+++ b/tests/examplefiles/test.odin
@@ -0,0 +1,43 @@
+--
+-- Example of a fragment of an openEHR Archetype, written in the Object Data Instance Notation (ODIN)
+-- Definition available here: https://github.com/openEHR/odin
+-- Author: Thomas Beale
+--
+
+ original_author = <
+ ["name"] = <"Dr J Joyce">
+ ["organisation"] = <"NT Health Service">
+ ["date"] = <2003-08-03>
+ >
+ term_bindings = <
+ ["umls"] = <
+ ["id1"] = <http://umls.nlm.edu/id/C124305> -- apgar result
+ ["id2"] = <http://umls.nlm.edu/id/0000000> -- 1-minute event
+ >
+ >
+ lifecycle_state = <"initial">
+ resource_package_uri = <"http://www.aihw.org.au/data_sets/diabetic_archetypes.html">
+
+ details = <
+ ["en"] = <
+ language = <[iso_639-1::en]>
+ purpose = <"archetype for diabetic patient review">
+ use = <"used for all hospital or clinic-based diabetic reviews,
+ including first time. Optional sections are removed according to the particular review"
+ >
+ misuse = <"not appropriate for pre-diagnosis use">
+ original_resource_uri = <"http://www.healthdata.org.au/data_sets/diabetic_review_data_set_1.html">
+ >
+ ["de"] = <
+ language = <[iso_639-1::de]>
+ purpose = <"Archetyp für die Untersuchung von Patienten mit Diabetes">
+ use = <"wird benutzt für alle Diabetes-Untersuchungen im
+ Krankenhaus, inklusive der ersten Vorstellung. Optionale
+ Abschnitte werden in Abhängigkeit von der speziellen
+ Vorstellung entfernt."
+ >
+ misuse = <"nicht geeignet für Benutzung vor Diagnosestellung">
+ original_resource_uri = <"http://www.healthdata.org.au/data_sets/diabetic_review_data_set_1.html">
+ >
+ >
+
diff --git a/tests/examplefiles/test.psl b/tests/examplefiles/test.psl
new file mode 100644
index 00000000..3ac99498
--- /dev/null
+++ b/tests/examplefiles/test.psl
@@ -0,0 +1,182 @@
+// This is a comment
+
+// 1. Basics
+
+// Functions
+func Add(X : Univ_Integer; Y : Univ_Integer) -> Univ_Integer is
+ return X + Y;
+end func Add;
+// End of line semi-colons are optional
+// +, +=, -, -=, *, *=, /, /=
+// all do what you'd expect (/ is integer division)
+
+// If you find Univ_Integer to be too verbose you can import Short_Names
+// which defines aliases like Int for Univ_Integer and String for Univ_String
+import PSL::Short_Names::*, *
+
+func Greetings() is
+ const S : String := "Hello, World!"
+ Println(S)
+end func Greetings
+// All declarations are 'const', 'var', or 'ref'
+// Assignment is :=, equality checks are ==, and != is not equals
+
+func Boolean_Examples(B : Bool) is
+ const And := B and #true // Parallel execution of operands
+ const And_Then := B and then #true // Short-Circuit
+ const Or := B or #false // Parallel execution of operands
+ const Or_Else := B or else #false // Short-Cirtuit
+ const Xor := B xor #true
+ var Result : Bool := #true;
+ Result and= #false;
+ Result or= #true;
+ Result xor= #false;
+end func Boolean_Examples
+// Booleans are a special type of enumeration
+// All enumerations are preceded by a sharp '#'
+
+func Fib(N : Int) {N >= 0} -> Int is
+ if N <= 1 then
+ return N
+ else
+ // Left and right side of '+' are computed in Parallel here
+ return Fib(N - 1) + Fib(N - 2)
+ end if
+end func Fib
+// '{N >= 0}' is a precondition to this function
+// Preconditions are built in to the language and checked by the compiler
+
+// ParaSail does not have mutable global variables
+// Instead, use 'var' parameters
+func Increment_All(var Nums : Vector<Int>) is
+ for each Elem of Nums concurrent loop
+ Elem += 1
+ end loop
+end func Increment_All
+// The 'concurrent' keyword in the loop header tells the compiler that
+// iterations of the loop can happen in any order.
+// It will choose the most optimal number of threads to use.
+// Other options are 'forward' and 'reverse'.
+
+func Sum_Of_Squares(N : Int) -> Int is
+ // The type of Sum is inferred
+ var Sum := 0
+ for I in 1 .. N forward loop
+ Sum += I ** 2 // ** is exponentiation
+ end loop
+end func Sum_Of_Squares
+
+func Sum_Of(N : Int; Map : func (Int) -> Int) -> Int is
+ return (for I in 1 .. N => <0> + Map(I))
+end func Sum_Of
+// It has functional aspects as well
+// Here, we're taking an (Int) -> Int function as a parameter
+// and using the inherently parallel map-reduce.
+// Initial value is enclosed with angle brackets
+
+func main(Args : Basic_Array<String>) is
+ Greetings() // Hello World
+ Println(Fib(5)) // 5
+ // Container Comprehension
+ var Vec : Vector<Int> := [for I in 0 .. 10 {I mod 2 == 0} => I ** 2]
+ // Vec = [0, 4, 16, 36, 64, 100]
+ Increment_All(Vec)
+ // Vec = [1, 5, 17, 37, 65, 101]
+ // '|' is an overloaded operator.
+ // It's usually used for concatenation or adding to a container
+ Println("First: " | Vec[1] | ", Last: " | Vec[Length(Vec)]);
+ // Vectors are 1 indexed, 0 indexed ZVectors are also available
+
+ Println(Sum_Of_Squares(3))
+
+ // Sum of fibs!
+ Println(Sum_Of(10, Fib))
+end func main
+
+// Preceding a type with 'optional' allows it to take the value 'null'
+func Divide(A, B, C : Real) -> optional Real is
+ // Real is the floating point type
+ const Epsilon := 1.0e-6;
+ if B in -Epsilon .. Epsilon then
+ return null
+ elsif C in -Epsilon .. Epsilon then
+ return null
+ else
+ return A / B + A / C
+ end if
+end func Divide
+
+// 2. Modules
+// Modules are composed of an interface and a class
+// ParaSail has object orientation features
+
+// modules can be defined as 'concurrent'
+// which allows 'locked' and 'queued' parameters
+concurrent interface Locked_Box<Content_Type is Assignable<>> is
+ // Create a box with the given content
+ func Create(C : optional Content_Type) -> Locked_Box;
+
+ // Put something into the box
+ func Put(locked var B : Locked_Box; C : Content_Type);
+
+ // Get a copy of current content
+ func Content(locked B : Locked_Box) -> optional Content_Type;
+
+ // Remove current content, leaving it null
+ func Remove(locked var B : Locked_Box) -> optional Content_Type;
+
+ // Wait until content is non-null, then return it, leaving it null.
+ func Get(queued var B : Locked_Box) -> Content_Type;
+end interface Locked_Box;
+
+concurrent class Locked_Box is
+ var Content : optional Content_Type;
+exports
+ func Create(C : optional Content_Type) -> Locked_Box is
+ return (Content => C);
+ end func Create;
+
+ func Put(locked var B : Locked_Box; C : Content_Type) is
+ B.Content := C;
+ end func Put;
+
+ func Content(locked B : Locked_Box) -> optional Content_Type is
+ return B.Content;
+ end func Content;
+
+ func Remove(locked var B : Locked_Box) -> Result : optional Content_Type is
+ // '<==' is the move operator
+ // It moves the right operand into the left operand,
+ // leaving the right null.
+ Result <== B.Content;
+ end func Remove;
+
+ func Get(queued var B : Locked_Box) -> Result : Content_Type is
+ queued until B.Content not null then
+ Result <== B.Content;
+ end func Get;
+end class Locked_Box;
+
+func Use_Box(Seed : Univ_Integer) is
+ var U_Box : Locked_Box<Univ_Integer> := Create(null);
+ // The type of 'Ran' can be left out because
+ // it is inferred from the return type of Random::Start
+ var Ran := Random::Start(Seed);
+
+ Println("Starting 100 pico-threads trying to put something in the box");
+ Println(" or take something out.");
+ for I in 1..100 concurrent loop
+ if I < 30 then
+ Println("Getting out " | Get(U_Box));
+ else
+ Println("Putting in " | I);
+ U_Box.Put(I);
+
+ // The first parameter can be moved to the front with a dot
+ // X.Foo(Y) is equivalent to Foo(X, Y)
+ end if;
+ end loop;
+
+ Println("And the winner is: " | Remove(U_Box));
+ Println("And the box is now " | Content(U_Box));
+end func Use_Box;
diff --git a/tests/examplefiles/test2.odin b/tests/examplefiles/test2.odin
new file mode 100644
index 00000000..2a6b4517
--- /dev/null
+++ b/tests/examplefiles/test2.odin
@@ -0,0 +1,30 @@
+school_schedule = <
+ lesson_times = <08:30:00, 09:30:00, 10:30:00, ...>
+
+ locations = <
+ [1] = <"under the big plane tree">
+ [2] = <"under the north arch">
+ [3] = <"in a garden">
+ >
+
+ subjects = <
+ ["philosophy:plato"] = < -- note construction of key
+ name = <"philosophy">
+ teacher = <"plato">
+ topics = <"meta-physics", "natural science">
+ weighting = <76%>
+ >
+ ["philosophy:kant"] = <
+ name = <"philosophy">
+ teacher = <"kant">
+ topics = <"meaning and reason", "meta-physics", "ethics">
+ weighting = <80%>
+ >
+ ["art"] = <
+ name = <"art">
+ teacher = <"goya">
+ topics = <"technique", "portraiture", "satire">
+ weighting = <78%>
+ >
+ >
+>
diff --git a/tests/examplefiles/test_basic.adls b/tests/examplefiles/test_basic.adls
new file mode 100644
index 00000000..df5aa743
--- /dev/null
+++ b/tests/examplefiles/test_basic.adls
@@ -0,0 +1,28 @@
+--
+-- Example of an openEHR Archetype, written in the Archetype Definition Language (ADL)
+-- Definition available here: http://www.openehr.org/releases/trunk/architecture/am/adl2.pdf
+-- Author: derived from the openEHR-EHR-EVALUATION.adverse_reaction.v1 archetype at http://www.openEHR.org/ckm
+--
+
+archetype (adl_version=2.0.5; rm_release=1.0.2; generated)
+ openEHR-EHR-EVALUATION.adverse_reaction.v1.0.0
+
+language
+ original_language = <[ISO_639-1::en]>
+
+description
+ lifecycle_state = <"unmanaged">
+
+definition
+ EVALUATION[id1]
+
+terminology
+ term_definitions = <
+ ["en"] = <
+ ["id1"] = <
+ text = <"Adverse Reaction">
+ description = <"xxx">
+ >
+ >
+ >
+
diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py
index c1e83077..5883fb5c 100644
--- a/tests/test_cmdline.py
+++ b/tests/test_cmdline.py
@@ -151,7 +151,7 @@ class CmdLineTest(unittest.TestCase):
o = self.check_success('-Fhighlight:tokentype=Name.Blubb,'
'names=TESTFILE filename',
'-fhtml', filename)
- self.assertTrue('<span class="n-Blubb' in o)
+ self.assertTrue('<span class="n n-Blubb' in o)
def test_H_opt(self):
o = self.check_success('-H', 'formatter', 'html')
diff --git a/tests/test_lexers_other.py b/tests/test_lexers_other.py
index 7457d045..bb667c05 100644
--- a/tests/test_lexers_other.py
+++ b/tests/test_lexers_other.py
@@ -6,14 +6,12 @@
:copyright: Copyright 2006-2015 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
-
import glob
import os
import unittest
from pygments.lexers import guess_lexer
-from pygments.lexers.scripting import RexxLexer
-
+from pygments.lexers.scripting import EasytrieveLexer, JclLexer, RexxLexer
def _exampleFilePath(filename):
return os.path.join(os.path.dirname(__file__), 'examplefiles', filename)
@@ -36,7 +34,24 @@ class AnalyseTextTest(unittest.TestCase):
self.assertEqual(guessedLexer.name, lexer.name)
def testCanRecognizeAndGuessExampleFiles(self):
- self._testCanRecognizeAndGuessExampleFiles(RexxLexer)
+ LEXERS_TO_TEST = [
+ EasytrieveLexer,
+ JclLexer,
+ RexxLexer,
+ ]
+ for lexerToTest in LEXERS_TO_TEST:
+ self._testCanRecognizeAndGuessExampleFiles(lexerToTest)
+
+
+class EasyTrieveLexerTest(unittest.TestCase):
+ def testCanGuessFromText(self):
+ self.assertLess(0, EasytrieveLexer.analyse_text('MACRO'))
+ self.assertLess(0, EasytrieveLexer.analyse_text('\nMACRO'))
+ self.assertLess(0, EasytrieveLexer.analyse_text(' \nMACRO'))
+ self.assertLess(0, EasytrieveLexer.analyse_text(' \n MACRO'))
+ self.assertLess(0, EasytrieveLexer.analyse_text('*\nMACRO'))
+ self.assertLess(0, EasytrieveLexer.analyse_text(
+ '*\n *\n\n \n*\n MACRO'))
class RexxLexerTest(unittest.TestCase):
diff --git a/tests/test_shell.py b/tests/test_shell.py
index fd5009b0..4eb5a15a 100644
--- a/tests/test_shell.py
+++ b/tests/test_shell.py
@@ -61,3 +61,29 @@ class BashTest(unittest.TestCase):
]
self.assertEqual(tokens, list(self.lexer.get_tokens(fragment)))
+ def testShortVariableNames(self):
+ fragment = u'x="$"\ny="$_"\nz="$abc"\n'
+ tokens = [
+ # single lone $
+ (Token.Name.Variable, u'x'),
+ (Token.Operator, u'='),
+ (Token.Literal.String.Double, u'"'),
+ (Token.Text, u'$'),
+ (Token.Literal.String.Double, u'"'),
+ (Token.Text, u'\n'),
+ # single letter shell var
+ (Token.Name.Variable, u'y'),
+ (Token.Operator, u'='),
+ (Token.Literal.String.Double, u'"'),
+ (Token.Name.Variable, u'$_'),
+ (Token.Literal.String.Double, u'"'),
+ (Token.Text, u'\n'),
+ # multi-letter user var
+ (Token.Name.Variable, u'z'),
+ (Token.Operator, u'='),
+ (Token.Literal.String.Double, u'"'),
+ (Token.Name.Variable, u'$abc'),
+ (Token.Literal.String.Double, u'"'),
+ (Token.Text, u'\n'),
+ ]
+ self.assertEqual(tokens, list(self.lexer.get_tokens(fragment)))
diff --git a/tests/test_terminal_formatter.py b/tests/test_terminal_formatter.py
new file mode 100644
index 00000000..07337cd5
--- /dev/null
+++ b/tests/test_terminal_formatter.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+"""
+ Pygments terminal formatter tests
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2006-2015 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+from __future__ import print_function
+
+import unittest
+import re
+
+from pygments.util import StringIO
+from pygments.lexers.sql import PlPgsqlLexer
+from pygments.formatters import TerminalFormatter
+
+DEMO_TEXT = '''\
+-- comment
+select
+* from bar;
+'''
+DEMO_LEXER = PlPgsqlLexer
+DEMO_TOKENS = list(DEMO_LEXER().get_tokens(DEMO_TEXT))
+
+ANSI_RE = re.compile(r'\x1b[\w\W]*?m')
+
+def strip_ansi(x):
+ return ANSI_RE.sub('', x)
+
+class TerminalFormatterTest(unittest.TestCase):
+ def test_reasonable_output(self):
+ out = StringIO()
+ TerminalFormatter().format(DEMO_TOKENS, out)
+ plain = strip_ansi(out.getvalue())
+ self.assertEqual(DEMO_TEXT.count('\n'), plain.count('\n'))
+ print(repr(plain))
+
+ for a, b in zip(DEMO_TEXT.splitlines(), plain.splitlines()):
+ self.assertEqual(a, b)
+
+ def test_reasonable_output_lineno(self):
+ out = StringIO()
+ TerminalFormatter(linenos=True).format(DEMO_TOKENS, out)
+ plain = strip_ansi(out.getvalue())
+ self.assertEqual(DEMO_TEXT.count('\n') + 1, plain.count('\n'))
+ print(repr(plain))
+
+ for a, b in zip(DEMO_TEXT.splitlines(), plain.splitlines()):
+ self.assertTrue(a in b)