summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorGaurav Jain <gaurav@gauravjain.org>2014-05-17 10:06:29 -0400
committerGaurav Jain <gaurav@gauravjain.org>2014-05-17 10:06:29 -0400
commitb4328f0a0cd095ce34eb4614cfd3267d695ddf8f (patch)
tree6af6ad8b23f89c47746c280f7e2bf8cbefcd4ce6 /tests
parent16cc059837eb83f96f35caf207c1e0778673f63c (diff)
parent778edd1d5ff974b1d4084af964151d9f87f05efd (diff)
downloadpygments-b4328f0a0cd095ce34eb4614cfd3267d695ddf8f.tar.gz
Merged birkenfeld/pygments-main into default
Diffstat (limited to 'tests')
-rw-r--r--tests/examplefiles/demo.cfm12
-rw-r--r--tests/examplefiles/example.coffee (renamed from tests/examplefiles/function_arrows.coffee)16
-rw-r--r--tests/examplefiles/example.hs (renamed from tests/examplefiles/import.hs)12
-rw-r--r--tests/examplefiles/example.hx45
-rw-r--r--tests/examplefiles/example.j564
-rw-r--r--tests/examplefiles/example.java16
-rw-r--r--tests/examplefiles/example.reds26
-rw-r--r--tests/examplefiles/example.rkt706
-rw-r--r--tests/examplefiles/test.r334
-rw-r--r--tests/examplefiles/vimrc21
-rw-r--r--tests/string_asserts.py22
-rw-r--r--tests/test_cfm.py46
-rw-r--r--tests/test_clexer.py20
-rw-r--r--tests/test_rtf_formatter.py109
-rw-r--r--tests/test_string_asserts.py39
15 files changed, 1641 insertions, 47 deletions
diff --git a/tests/examplefiles/demo.cfm b/tests/examplefiles/demo.cfm
index d94a06a0..49690484 100644
--- a/tests/examplefiles/demo.cfm
+++ b/tests/examplefiles/demo.cfm
@@ -1,4 +1,11 @@
<!--- cfcomment --->
+<!--- nested <!--- cfcomment ---> --->
+<!--- multi-line
+nested
+<!---
+cfcomment
+--->
+--->
<!-- html comment -->
<html>
<head>
@@ -17,6 +24,9 @@
#IsDate("foo")#<br />
#DaysInMonth(RightNow)#
</cfoutput>
+<cfset x="x">
+<cfset y="y">
+<cfset z="z">
<cfoutput group="x">
#x#
<cfoutput>#y#</cfoutput>
@@ -29,6 +39,8 @@
<cfset greeting = "Hello #person#">
<cfset greeting = "Hello" & " world!">
+<cfset a = 5>
+<cfset b = 10>
<cfset c = a^b>
<cfset c = a MOD b>
<cfset c = a / b>
diff --git a/tests/examplefiles/function_arrows.coffee b/tests/examplefiles/example.coffee
index cd1ef1e8..2cbd1df3 100644
--- a/tests/examplefiles/function_arrows.coffee
+++ b/tests/examplefiles/example.coffee
@@ -1,3 +1,5 @@
+# function arrows
+
methodA:-> 'A'
methodB:=> 'B'
methodC:()=> 'C'
@@ -9,3 +11,17 @@ methodF:(c,d)-> 'F'
(-> 'I')
(=> 'J')
+
+# strings
+
+"#{wow}"
+"w#{wow}w"
+"#wow"
+"wow#"
+"w#ow"
+
+'#{wow}'
+'w#{wow}w'
+'#wow'
+'wow#'
+'w#ow'
diff --git a/tests/examplefiles/import.hs b/tests/examplefiles/example.hs
index f266f62e..9efd3364 100644
--- a/tests/examplefiles/import.hs
+++ b/tests/examplefiles/example.hs
@@ -1,3 +1,5 @@
+module ĈrazyThings where
+
import "base" Data.Char
import "base" Data.Char (isControl, isSpace)
import "base" Data.Char (isControl, --isSpace)
@@ -13,3 +15,13 @@ import "base" Data.Char (isControl, -- isSpace)
main :: IO ()
main = putStrLn "hello world"
+
+gádd x y = x + y
+ádd x y = x + y
+
+
+data ĈrazyThings =
+ Ĉar |
+ House |
+ Peár
+ deriving (Show, Eq)
diff --git a/tests/examplefiles/example.hx b/tests/examplefiles/example.hx
index fd93bb49..381cf825 100644
--- a/tests/examplefiles/example.hx
+++ b/tests/examplefiles/example.hx
@@ -139,4 +139,47 @@ typedef Pt2 = {
y:Float,
?z:Float, //optional z
add : Point -> Void,
-} \ No newline at end of file
+}
+
+
+//top-level class members
+public function test();
+private var attr(get, set) = 1;
+
+
+//pre-proc number
+public static inline function indexOf<T>(arr:Array<T>, v:T) : Int
+{
+ #if (haxe_ver >= 3.1)
+ return arr.indexOf(v);
+ #else
+ #if (flash || js)
+ return untyped arr.indexOf(v);
+ #else
+ return std.Lambda.indexOf(arr, v);
+ #end
+ #end
+}
+
+//macro reification
+var e = macro var $myVar = 0;
+var e = macro ${v}.toLowerCase();
+var e = macro o.$myField;
+var e = macro { $myField : 0 };
+var e = macro $i{varName}++;
+var e = macro $v{myStr};
+var args = [macro "sub", macro 3];
+var e = macro "Hello".toLowerCase($a{args});
+(macro $i{tmp}.addAtom($v{name}, $atom)).finalize(op.pos);
+
+var c = macro class MyClass {
+ public function new() { }
+ public function $funcName() {
+ trace($v{funcName} + " was called");
+ }
+}
+
+var c = macro interface IClass {};
+
+//ECheckType
+var f = (123:Float); \ No newline at end of file
diff --git a/tests/examplefiles/example.j b/tests/examplefiles/example.j
new file mode 100644
index 00000000..16cdde86
--- /dev/null
+++ b/tests/examplefiles/example.j
@@ -0,0 +1,564 @@
+; Example JVM assembly
+; Tested with JasminXT 2.4
+
+.bytecode 49.0
+.source HelloWorld.java
+.class public final enum HelloWorld
+.super java/lang/Object
+.implements java/io/Serializable
+.signature "Ljava/lang/Object;Ljava/io/Serializable;"
+.enclosing method hw/jasmin.HelloWorldRunner.run()V
+.deprecated
+.annotation visible HelloWorld
+ I I = 0
+.end annotation
+.debug "Happy debugging!"
+
+.inner interface public InnerInterface inner 'HelloWorld$InnerInterface' outer HelloWorld
+.inner class public InnerClass inner HelloWorld$InnerClass outer 'HelloWorld'
+
+.field public volatile transient I I
+.field static protected final serialVersionUID 'J' signature "TJ;" = 2147483648
+.field annotation protected 'protected' [[[Lcom/oracle/util/Checksums;
+ .deprecated
+ .signature "[[[Lcom/oracle/util/Checksums;"
+ .attribute foo "foo.txt"
+ .attribute 'foo' "foo.txt"
+.end field
+.field public newline I
+.field public static defaultString 'Ljava/lang/String;'
+
+.method public <init>()V
+ .limit stack 3
+.line 7
+ .var 0 is self LHelloWorld; from 0 to 1
+ aload_0
+ invokenonvirtual java/lang/Object/<init>()V
+ return
+.end method
+
+.method static public main([Ljava/lang/String;)V
+ .limit locals 7
+ .limit stack 10
+ .throws java.lang/RuntimeException
+ .catch java/lang.ClassCastException from cast to 'extra_l' using /extra
+ .signature "([Ljava/lang/String;)V"
+ .stack
+ offset /Input
+ locals Object java/lang/String
+ locals Uninitialized 'End'
+ locals Uninitialized 0
+ locals Top
+ locals Integer
+ locals Float
+ locals Long
+ locals Double
+ locals Null
+ locals UninitializedThis
+ stack Object java/lang/String
+ stack Uninitialized End
+ stack 'Uninitialized' 0
+ stack 'Top'
+ stack Integer
+ stack Float
+ stack Long
+ stack Double
+ stack Null
+ stack UninitializedThis
+ .end stack
+ .stack use 1 locals
+ offset 'extra'
+ .end stack
+ .stack use locals
+ .end stack
+.line 0xd
+ .var 0 is args [Ljava/lang/String;
+ aload_w 0
+ arraylength
+ ifne /Input
+ iconst_1
+ anewarray java/lang/String
+ checkcast [Ljava/lang/String;
+ astore_0
+ aload_0
+ iconst_0
+ ldc "World"
+ dup
+ putstatic HelloWorld.defaultString Ljava/lang/String;
+ aastore
+/Input:
+ iconst_2
+ iconst_3
+ multianewarray [[C 2
+ astore_1
+ aload_1
+ iconst_0
+ aaload
+ astore_2
+ aload_1
+ iconst_1
+ aaload
+ astore_3
+
+<<o:
+ aload_3
+ iconst_0
+ invokestatic HelloWorld/int()I
+ castore
+
+<<\u0020:
+ aload_3
+ dconst_1
+ dconst_0
+ dsub
+ d2i
+ invokestatic HelloWorld/double()D
+ d2i
+ castore
+
+<<!:
+ aload_3
+ lconst_0
+ dup2
+ lxor
+ lconst_1
+ dup2
+ ladd
+ lsub
+ lneg
+ l2i
+ invokestatic HelloWorld/long()J
+ l2i
+ castore
+
+<<H:
+ aload_2
+ fconst_0
+ fconst_1
+ fconst_2
+ dup_x2
+ fdiv
+ fmul
+ f2l
+ l2i
+ swap
+ invokestatic HelloWorld/float(F)F
+ f2i
+ castore
+
+<<e :
+ aload_2
+ iconst_1
+ i2s
+ i2c
+ i2b
+ iconst_1
+ newarray short
+ dup
+ iconst_0
+ iconst_1
+ newarray byte
+ dup
+ iconst_0
+ sipush 0x65
+ bastore
+ iconst_0
+ baload
+ sastore
+ iconst_0
+ saload
+ int2short
+ int2char
+ int2byte
+ castore
+
+ <<l :
+ aload_2
+ iconst_2
+ bipush 0x1b
+*2:
+ iconst_1
+ ishl
+ dup
+ lookupswitch
+ 0: '/lookupswitch'
+ 0x6c: /lookupswitch
+ default: *2
+/lookupswitch:
+ castore
+
+ ldc2_w 2
+ dup2
+ lcmp
+ .set i 4
+ .set 'j' 5
+ .var 4 is i I from 'i++' to End
+ .var 5 is j I signature "I" from i++ to End
+ istore 4
+ goto 1
+i++:
+ iinc 4 1
+1: iconst_0
+ istore_w 5
+ goto_w 2
+j++:
+ iinc_w 5 1
+2: getstatic java/lang/System/out Ljava/io/PrintStream;
+ aload_1
+ iload 4
+ aaload
+ iload_w 5
+ caload
+ invokevirtual java/io/PrintStream/print(C)V
+ iload 5
+ iconst_1
+ if_icmpne $+6
+ jsr extra
+ iload 5
+ iconst_2
+ if_icmplt j++
+ iconst_1
+ iload 4
+ if_icmpgt i++
+
+<<\u00a0:
+ getstatic java/lang/System/out Ljava/io/PrintStream;
+ invokestatic HelloWorld/get"example()LHelloWorld;
+ getfield HelloWorld/newline I
+ invokevirtual java/io/PrintStream/print(C)V
+End:
+ return
+
+extra:
+ astore 6
+ iload 4
+ tableswitch 0 1
+ extra_l
+ extra_string
+ default: 'End'
+ nop
+extra_string:
+ getstatic java/lang/System/out Ljava/io/PrintStream;
+ aload 0
+ iconst_0
+ aaload
+ invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
+cast:
+ ldc java/lang/String
+ checkcast java/lang/Class
+ pop
+ ldc Ljava/lang/String;
+ checkcast Ljava/lang/Class;
+ pop
+ iconst_1
+ dup
+ newarray boolean
+ checkcast [Z
+ pop
+ newarray 'int'
+ checkcast HelloWorld
+ checkcast LHelloWorld;
+ pop
+extra_l:
+ getstatic java/lang/System/out Ljava/io/PrintStream;
+ dup
+ ldc "\123.\456.\u006c.\n.\r.\t.\f.\b.\".\'.\\"
+ iconst_5
+ invokeinterface java/lang/CharSequence/charAt(I)C 2
+ invokevirtual java/io/PrintStream/print(C)V
+/extra:
+ pop
+ ret 6
+.end method
+
+.method private static get"example()LHelloWorld;
+ .limit locals 3
+ .limit stack 4
+ .catch all from 7 to 53 using 59
+ aconst_null
+ dup
+ dup
+ astore_w 0
+try:
+ goto $+0x11
+finally:
+ astore_w 2
+ putfield HelloWorld/newline I
+ ret_w 2
+ nop
+ aload_0
+ areturn
+ ifnonnull $-2
+ ifnull $+3
+ new HelloWorld
+ dup
+ dup
+ invokespecial HelloWorld/<init>()V
+ astore 0
+ aload 0
+ monitorenter
+ monitorexit
+ new java/lang/RuntimeException
+ dup
+ invokespecial java/lang/RuntimeException/<init>()V
+ athrow
+ aconst_null
+/try:
+ dup
+ aconst_null
+ if_acmpeq $+3
+ areturn
+catch:
+ jsr $+10
+ aload_0
+ dup
+ aconst_null
+ if_acmpne /try
+ areturn
+ astore_1
+ aload_0
+ ldc 10
+ jsr_w finally
+ ret 1
+'single\u0020quoted\u0020label': ; Messes up [@ below if lexed sloppily
+.end method
+
+.method varargs private static int()I
+ .annotation invisible HelloWorld
+ [@ [@ WhatIsThis??? = .annotation ; name, type, exttype
+ I I = 1 ; name, type
+ another-I I = 2
+ Enum e Ljava/util/logging/Level; = FINE
+ .end annotation
+ .annotation
+ s s = "foo"
+ another-s s = "bar"
+ Enum [e Ljava/util/logging/Level; = FINE FINE 'FINE' FINE
+ .end annotation
+ float F = 123.456
+ .end annotation
+ .annotation visibleparam 1 LHelloWorld;
+ x [I = 0x01 0x02 0x03
+ y I = 2
+ .end annotation
+ .annotation invisibleparam 255 HelloWorld
+ a F = 1.2
+ b D = 3.4
+ .end annotation
+ .annotation default
+ I = 0
+ .end annotation
+ .limit locals 4
+ .limit stack 20
+ iconst_1
+ newarray int
+ dup
+ dup
+ instanceof [Z
+ bipush 0x9
+ bipush 0xB
+ iand
+ iconst_5
+ iconst_4
+ dup_x1
+ iconst_m1
+ iadd
+ bipush +-111
+ ineg
+ swap
+ idiv
+ dup_x2
+ dup
+ ishr
+ ishl
+ imul
+ ior
+ bipush -73
+ ixor
+ isub
+ dup
+ iconst_1
+ iadd
+ irem
+ iastore
+ iconst_0
+ iaload
+ istore_0
+ iload_0
+ istore_1
+ iload_1
+ istore_2
+ iload_2
+ istore_3
+ iload_3
+ dup
+ dup
+ dup2_x1
+ if_icmpeq $+33
+ dup
+ dup
+ if_icmpge $+28
+ dup
+ dup
+ if_icmple $+23
+ dup
+ ifle $+19
+ dup
+ ifeq $+15
+ dup
+ iflt $+11
+ dup
+ ifgt $+7
+ dup
+ ifge $+3
+ ireturn
+.end method
+
+.method static private fpstrict double()D
+ .limit locals 7
+ .limit stack 11
+ dconst_1
+ dconst_0
+ dcmpg
+ newarray double
+ dup
+ dconst_0
+ dup2
+ dcmpl
+ ldc2_w 128.
+ ldc2_w -240.221d
+ dneg
+ ldc2_w 158.d
+ dup2
+ dadd
+ dup2_x2
+ drem
+ ddiv
+ pop2
+ dconst_1
+ dmul
+ d2f
+ f2d
+ d2l
+ l2i
+ iconst_2
+ iushr
+ i2d
+ dastore
+ iconst_0
+ daload
+ dstore_0
+ dload_0
+ dstore_1
+ dload_1
+ dstore_2
+ dload_2
+ dstore_3
+ dload_3
+ dstore 4
+ dload 4
+ dstore_w 5
+ dload_w 5
+ dreturn
+.end method
+
+.method static long()J
+ .limit locals 7
+ .limit stack 11
+ iconst_1
+ newarray long
+ dup
+ iconst_0
+ ldc2_w 5718613688
+ ldc2_w 3143486100
+ ldc2_w 0x3
+ ldiv
+ lmul
+ ldc2_w -10000000000
+ lrem
+ ldc_w 0x60
+ i2l
+ lor
+ ldc 0x33
+ i2l
+ land
+ dup2
+ iconst_1
+ lshl
+ iconst_3
+ lshr
+ iconst_3
+ lushr
+ ladd
+ l2d
+ d2l
+ l2f
+ f2l
+ lastore
+ iconst_0
+ laload
+ lstore_0
+ lload_0
+ lstore_1
+ lload_1
+ lstore_2
+ lload_2
+ lstore_3
+ lload_3
+ lstore 4
+ lload 4
+ lstore_w 5
+ lload_w 5
+ lreturn
+.end method
+
+.method private static float(F)F
+ .limit locals 6
+ .limit stack 9
+ iconst_1
+ newarray float
+ dup
+ fload_0
+ dup
+ fcmpg
+ fload_0
+ dup
+ dup
+ dup
+ dup2_x2
+ fadd
+ fsub
+ fneg
+ frem
+ ldc 70
+ i2f
+ fadd
+ fadd
+ swap
+ pop
+ fastore
+ fload_0
+ dup
+ fcmpl
+ faload
+ fstore_0
+ fload_0
+ fstore_1
+ fload_1
+ fstore_2
+ fload_2
+ fstore_3
+ fload_3
+ fstore 4
+ fload 4
+ fstore_w 5
+ fload_w 5
+ freturn
+.end method
+
+.method abstract bridge synthetic 'acc1()V'
+ breakpoint
+.end method
+
+.method native synchronized acc2()V
+.end method
diff --git a/tests/examplefiles/example.java b/tests/examplefiles/example.java
new file mode 100644
index 00000000..f2e94322
--- /dev/null
+++ b/tests/examplefiles/example.java
@@ -0,0 +1,16 @@
+class _PostUnico$deClassá
+{void fo$o() {}
+
+ void PostUnicodeFunctioná() {
+ láb$el:
+ break láb$el;
+
+ }
+}
+
+class áPreUnicode$Class
+{
+ public int $foo;
+ public int á$foo;
+ _PostUnico$deClassá áPreUnicodeFunction() { return null; }
+}
diff --git a/tests/examplefiles/example.reds b/tests/examplefiles/example.reds
index dd4ad0f9..eb92310d 100644
--- a/tests/examplefiles/example.reds
+++ b/tests/examplefiles/example.reds
@@ -109,6 +109,32 @@ foo char
;lit-word:
'foo 'foo
+;multiple comment tests...
+1 + 1
+comment "aa"
+2 + 2
+comment {aa}
+3 + 3
+comment {a^{}
+4 + 4
+comment {{}}
+5 + 5
+comment {
+ foo: 6
+}
+6 + 6
+comment [foo: 6]
+7 + 7
+comment [foo: "[" ]
+8 + 8
+comment [foo: {^{} ]
+9 + 9
+comment [foo: {boo} ]
+10 + 10
+comment 5-May-2014/11:17:34+2:00
+11 + 11
+
+
to-integer foo
foo/(a + 1)/b
diff --git a/tests/examplefiles/example.rkt b/tests/examplefiles/example.rkt
index a3e4a29e..acc0328e 100644
--- a/tests/examplefiles/example.rkt
+++ b/tests/examplefiles/example.rkt
@@ -1,5 +1,7 @@
#lang racket
+(require (only-in srfi/13 string-contains))
+
; Single-line comment style.
;; Single-line comment style.
@@ -8,45 +10,259 @@
#|
Multi-line comment style ...
+#|### #| nested |#||| |#
... on multiple lines
|#
-(define (a-function x #:keyword [y 0])
+#;(s-expression comment (one line))
+
+#;
+(s-expression comment
+ (multiple lines))
+
+#! shebang comment
+
+#!/shebang comment
+
+#! shebang \
+comment
+
+#!/shebang \
+comment
+
+;; Uncommented numbers after single-line comments
+;; NEL…133
+;; LS
8232
+;; PS
8233
+
+#reader racket
+(define(a-function x #:keyword [y 0])
(define foo0 'symbol) ; ()
[define foo1 'symbol] ; []
{define foo2 'symbol} ; {}
- (and (append (car '(1 2 3))))
+ (define 100-Continue 'symbol)
+ (and (append (car'(1 2 3))))
(regexp-match? #rx"foobar" "foobar")
- (regexp-match? #px"foobar" "foobar")
- (define a 1))
- (let ([b "foo"])
- (displayln b))
+ (regexp-match? #px"\"foo\\(bar\\)?\"" "foobar")
+ (regexp-match? #rx#"foobar" "foobar")
+ (regexp-match? #px#"foobar" "foobar")
+ (define #csa 1)
+ #Ci (let ([#%A|||b #true C
+\|d "foo"])
+ (displayln #cS #%\ab\ #true\ C\
+\\d||))
(for/list ([x (in-list (list 1 2 (list 3 4)))])
- (cond
- [(pair? x) (car x)]
- [else x])))
+ (cond
+ [(pair? x) (car x)]
+ [else x])))
-;; Literal number examples
+;; Literals
(values
;; #b
- #b1.1
- #b-1.1
- #b1e1
- #b0/1
- #b1/1
- #b1e-1
- #b101
-
+ #b1
+ #b+1
+ #b-1
+ #b.1
+ #b1.
+ #b0.1
+ #b+0.1
+ #b-0.1
+ #b1/10
+ #b+1/10
+ #b-1/10
+ #b1e11
+ #b+1e11
+ #b-1e11
+ #b.1e11
+ #b1.e11
+ #b0.1e11
+ #b+0.1e11
+ #b-0.1e11
+ #b1/10e11
+ #b+1/10e11
+ #b-1/10e11
+ #b+i
+ #b1+i
+ #b+1+i
+ #b-1+i
+ #b.1+i
+ #b1.+i
+ #b0.1+i
+ #b+0.1+i
+ #b-0.1+i
+ #b1/10+i
+ #b+1/10+i
+ #b-1/10+i
+ #b1e11+i
+ #b+1e11+i
+ #b-1e11+i
+ #b1.e11+i
+ #b.1e11+i
+ #b0.1e11+i
+ #b+0.1e11+i
+ #b-0.1e11+i
+ #b1/10e11+i
+ #b+1/10e11+i
+ #b-1/10e11+i
+ #b+1i
+ #b1+1i
+ #b+1+1i
+ #b-1+1i
+ #b1.+1i
+ #b.1+1i
+ #b0.1+1i
+ #b+0.1+1i
+ #b-0.1+1i
+ #b1/10+1i
+ #b+1/10+1i
+ #b-1/10+1i
+ #b1e11+1i
+ #b+1e11+1i
+ #b-1e11+1i
+ #b.1e11+1i
+ #b0.1e11+1i
+ #b+0.1e11+1i
+ #b-0.1e11+1i
+ #b1/10e11+1i
+ #b+1/10e11+1i
+ #b-1/10e11+1i
+ #b+1/10e11i
+ #b1+1/10e11i
+ #b+1+1/10e11i
+ #b-1+1/10e11i
+ #b.1+1/10e11i
+ #b0.1+1/10e11i
+ #b+0.1+1/10e11i
+ #b-0.1+1/10e11i
+ #b1/10+1/10e11i
+ #b+1/10+1/10e11i
+ #b-1/10+1/10e11i
+ #b1e11+1/10e11i
+ #b+1e11+1/10e11i
+ #b-1e11+1/10e11i
+ #b.1e11+1/10e11i
+ #b0.1e11+1/10e11i
+ #b+0.1e11+1/10e11i
+ #b-0.1e11+1/10e11i
+ #b1/10e11+1/10e11i
+ #b+1/10e11+1/10e11i
+ #b-1/10e11+1/10e11i
;; #d
- #d-1.23
- #d1.123
- #d1e3
- #d1e-22
- #d1/2
- #d-1/2
#d1
+ #d+1
#d-1
-
+ #d.1
+ #d1.
+ #d1.2
+ #d+1.2
+ #d-1.2
+ #d1/2
+ #d+1/2
+ #d-1/2
+ #d1e3
+ #d+1e3
+ #d-1e3
+ #d.1e3
+ #d1.e3
+ #d1.2e3
+ #d+1.2e3
+ #d-1.2e3
+ #d1/2e3
+ #d+1/2e3
+ #d-1/2e3
+ #d+i
+ #d1+i
+ #d+1+i
+ #d-1+i
+ #d.1+i
+ #d1.+i
+ #d1.2+i
+ #d+1.2+i
+ #d-1.2+i
+ #d1/2+i
+ #d+1/2+i
+ #d-1/2+i
+ #d1e3+i
+ #d+1e3+i
+ #d-1e3+i
+ #d1.e3+i
+ #d.1e3+i
+ #d1.2e3+i
+ #d+1.2e3+i
+ #d-1.2e3+i
+ #d1/2e3+i
+ #d+1/2e3+i
+ #d-1/2e3+i
+ #d+1i
+ #d1+1i
+ #d+1+1i
+ #d-1+1i
+ #d1.+1i
+ #d.1+1i
+ #d1.2+1i
+ #d+1.2+1i
+ #d-1.2+1i
+ #d1/2+1i
+ #d+1/2+1i
+ #d-1/2+1i
+ #d1e3+1i
+ #d+1e3+1i
+ #d-1e3+1i
+ #d.1e3+1i
+ #d1.2e3+1i
+ #d+1.2e3+1i
+ #d-1.2e3+1i
+ #d1/2e3+1i
+ #d+1/2e3+1i
+ #d-1/2e3+1i
+ #d+1/2e3i
+ #d1+1/2e3i
+ #d+1+1/2e3i
+ #d-1+1/2e3i
+ #d.1+1/2e3i
+ #d1.2+1/2e3i
+ #d+1.2+1/2e3i
+ #d-1.2+1/2e3i
+ #d1/2+1/2e3i
+ #d+1/2+1/2e3i
+ #d-1/2+1/2e3i
+ #d1e3+1/2e3i
+ #d+1e3+1/2e3i
+ #d-1e3+1/2e3i
+ #d.1e3+1/2e3i
+ #d1.2e3+1/2e3i
+ #d+1.2e3+1/2e3i
+ #d-1.2e3+1/2e3i
+ #d1/2e3+1/2e3i
+ #d+1/2e3+1/2e3i
+ #d-1/2e3+1/2e3i
+ ;; Extflonums
+ +nan.t
+ 1t3
+ +1t3
+ -1t3
+ .1t3
+ 1.t3
+ 1.2t3
+ +1.2t3
+ -1.2t3
+ 1/2t3
+ +1/2t3
+ -1/2t3
+ 1#t0
+ 1.#t0
+ .2#t0
+ 1.2#t0
+ 1#/2t0
+ 1/2#t0
+ 1#/2#t0
+ 1#t3
+ 1.#t3
+ .2#t3
+ 1.2#t3
+ 1#/2t3
+ 1/2#t3
+ 1#/2#t3
;; No # reader prefix -- same as #d
-1.23
1.123
@@ -56,7 +272,6 @@ Multi-line comment style ...
-1/2
1
-1
-
;; #e
#e-1.23
#e1.123
@@ -66,7 +281,24 @@ Multi-line comment style ...
#e-1
#e1/2
#e-1/2
-
+ ;; #d#e
+ #d#e-1.23
+ #d#e1.123
+ #d#e1e3
+ #d#e1e-22
+ #d#e1
+ #d#e-1
+ #d#e1/2
+ #d#e-1/2
+ ;; #e#d
+ #e#d-1.23
+ #e#d1.123
+ #e#d1e3
+ #e#d1e-22
+ #e#d1
+ #e#d-1
+ #e#d1/2
+ #e#d-1/2
;; #i always float
#i-1.23
#i1.123
@@ -76,7 +308,126 @@ Multi-line comment style ...
#i-1/2
#i1
#i-1
-
+ ;; Implicitly inexact numbers
+ +nan.0
+ 1#
+ 1.#
+ .2#
+ 1.2#
+ 1#/2
+ 1/2#
+ 1#/2#
+ 1#e3
+ 1.#e3
+ .2#e3
+ 1.2#e3
+ 1#/2e3
+ 1/2#e3
+ 1#/2#e3
+ +nan.0+i
+ 1#+i
+ 1.#+i
+ .2#+i
+ 1.2#+i
+ 1#/2+i
+ 1/2#+i
+ 1#/2#+i
+ 1#e3+i
+ 1.#e3+i
+ .2#e3+i
+ 1.2#e3+i
+ 1#/2e3+i
+ 1/2#e3+i
+ 1#/2#e3+i
+ +nan.0i
+ +1#i
+ +1.#i
+ +.2#i
+ +1.2#i
+ +1#/2i
+ +1/2#i
+ +1#/2#i
+ +1#e3i
+ +1.#e3i
+ +.2#e3i
+ +1.2#e3i
+ +1#/2e3i
+ +1/2#e3i
+ +1#/2#e3i
+ 0+nan.0i
+ 0+1#i
+ 0+1.#i
+ 0+.2#i
+ 0+1.2#i
+ 0+1#/2i
+ 0+1/2#i
+ 0+1#/2#i
+ 0+1#e3i
+ 0+1.#e3i
+ 0+.2#e3i
+ 0+1.2#e3i
+ 0+1#/2e3i
+ 0+1/2#e3i
+ 0+1#/2#e3i
+ 1#/2#e3+nan.0i
+ 1#/2#e3+1#i
+ 1#/2#e3+1.#i
+ 1#/2#e3+.2#i
+ 1#/2#e3+1.2#i
+ 1#/2#e3+1#/2i
+ 1#/2#e3+1/2#i
+ 1#/2#e3+1#/2#i
+ 1#/2#e3+1#e3i
+ 1#/2#e3+1.#e3i
+ 1#/2#e3+.2#e3i
+ 1#/2#e3+1.2#e3i
+ 1#/2#e3+1#/2e3i
+ 1#/2#e3+1/2#e3i
+ 1#/2#e3+1#/2#e3i
+ +nan.0@1
+ 1#@1
+ 1.#@1
+ .2#@1
+ 1.2#@1
+ 1#/2@1
+ 1/2#@1
+ 1#/2#@1
+ 1#e3@1
+ 1.#e3@1
+ .2#e3@1
+ 1.2#e3@1
+ 1#/2e3@1
+ 1/2#e3@1
+ 1#/2#e3@1
+ 1@+nan.0
+ 1@1#
+ 1@1.#
+ 1@.2#
+ 1@1.2#
+ 1@1#/2
+ 1@1/2#
+ 1@1#/2#
+ 1@1#e3
+ 1@1.#e3
+ 1@.2#e3
+ 1@1.2#e3
+ 1@1#/2e3
+ 1@1/2#e3
+ 1@1#/2#e3
+ 1#/2#e3@1#
+ 1#/2#e3@1.#
+ 1#/2#e3@.2#
+ 1#/2#e3@1.2#
+ 1#/2#e3@1#/2
+ 1#/2#e3@1/2#
+ 1#/2#e3@1#/2#
+ 1#/2#e3@1#e3
+ 1#/2#e3@1.#e3
+ 1#/2#e3@.2#e3
+ 1#/2#e3@1.2#e3
+ 1#/2#e3@1#/2e3
+ 1#/2#e3@1/2#e3
+ 1#/2#e3@1#/2#e3
;; #o
#o777.777
#o-777.777
@@ -86,10 +437,307 @@ Multi-line comment style ...
#o-3/7
#o777
#o-777
-
+ #e#o777.777
+ #e#o-777.777
+ #e#o777e777
+ #e#o777e-777
+ #e#o3/7
+ #e#o-3/7
+ #e#o777
+ #e#o-777
+ #i#o777.777
+ #i#o-777.777
+ #i#o777e777
+ #i#o777e-777
+ #i#o3/7
+ #i#o-3/7
+ #i#o777
+ #i#o-777
;; #x
#x-f.f
#xf.f
+ #xfsf
+ #xfs-f
+ #x7/f
+ #x-7/f
#x-f
#xf
+ #e#x-f.f
+ #e#xf.f
+ #e#xfsf
+ #e#xfs-f
+ #e#x7/f
+ #e#x-7/f
+ #e#x-f
+ #e#xf
+ #i#x-f.f
+ #i#xf.f
+ #i#xfsf
+ #i#xfs-f
+ #i#x7/f
+ #i#x-7/f
+ #i#x-f
+ #i#xf
+ ;; Not numbers
+ '-1.23x
+ '1.123x
+ '1e3x
+ '1e-22x
+ '1/2x
+ '-1/2x
+ '1x
+ '-1x
+ '/
+ '1/
+ '/2
+ '1//2
+ '1e3.
+ '1e
+ 'e3
+ '.i
+ '1.2.3
+ '1..2
+ '.1.
+ '@
+ '1@
+ '@2
+ '1@@2
+ '1@2@3
+ '1@2i
+ '1+-2i
+ '1i+2
+ '1i+2i
+ '1+2i+3i
+ '-
+ '--1
+ '+
+ '++1
+ '1/2.3
+ '1#2
+ '1#.2
+ '1.#2
+ '.#2
+ '+nan.t+nan.ti
+ '+nan.t@nan.t
+ ;; Booleans
+ #t
+ #T
+ #true
+ #f
+ #F
+ #false
+ ;; Characters, strings, and byte strings
+ #\
+ #\Null9
+ #\n9
+ #\99
+ #\0009
+ #\u3BB
+ #\u03BB9
+ #\U3BB
+ #\U000003BB9
+ #\λ9
+ "string\
+ \a.\b.\t.\n.\v.\f.\r.\e.\".\'.\\.\1.\123.\1234.\x9.\x30.\x303"
+ "\u9.\u1234.\u12345.\U9.\U00100000.\U001000000"
+ #"byte-string\7\xff\t"
+ #<<HERE STRING
+lorem ipsum
+dolor sit amet
+consectetur HERE STRING
+HERE STRING adipisicing elit
+HERE STRING
+ #|
+HERE STRING
+|#
+ ;; Other literals
+ #(vector)
+ #20()
+ #s[prefab-structure 1 2 3]
+ #&{box}
+ #hash(("a" . 5))
+ #hasheq((a . 5) (b . 7))
+ #hasheqv((a . 5) (b . 7))
+ #'(define x 1)
+ #`(define x #,pi)
+ ;; quote, quasiquote, and unquote
+ 'pi
+ ' pi
+ ''pi
+ '`pi
+ '`,pi
+ ',pi
+ `pi
+ ` pi
+ `'pi
+ ``pi
+ `,pi
+ ` , pi
+ `,'pi
+ `,`pi
+ `,`,pi
+ '(+)
+ ' (+)
+ ''(+)
+ '`(+)
+ ',(+)
+ `(+)
+ ` (+)
+ `'(+)
+ ``(+)
+ `,(+)
+ ` , (+)
+ `,'(+)
+ `,`(+)
+ `,`,(+)
+ #readerracket/base'pi.f
+ '#readerracket/base pi.f
+ #readerracket/base`pi.f
+ `#readerracket/base pi.f
+ #readerracket/base`,pi.f
+ `#readerracket/base,pi.f
+ `,#readerracket/base pi.f
+ #readerracket/base'`,pi.f
+ '#readerracket/base`,pi.f
+ '`#readerracket/base,pi.f
+ '`,#readerracket/base pi.f
+ #readerracket/base'(*)
+ '#readerracket/base(*)
+ #readerracket/base`(*)
+ `#readerracket/base(*)
+ #readerracket/base`,(*)
+ `#readerracket/base,(*)
+ `,#readerracket/base(*)
+ #readerracket/base'`,(*)
+ '#readerracket/base`,(*)
+ '`#readerracket/base,(*)
+ '`,#readerracket/base(*)
+ (quote pi)
+ (quote (quote pi))
+ (quote (quasiquote pi))
+ (quote (quasiquote (unquote pi)))
+ (quote (unquote pi))
+ (quasiquote pi)
+ (quasiquote (quote pi))
+ (quasiquote (quasiquote pi))
+ (quasiquote (unquote pi))
+ (quasiquote (unquote (quote pi)))
+ (quasiquote (unquote (quasiquote pi)))
+ (quasiquote (unquote (quasiquote (unquote pi))))
+ (quote (+))
+ (quote (quote (+)))
+ (quote (quasiquote (+)))
+ (quote (unquote (+)))
+ (quasiquote (+))
+ (quasiquote (quote (+)))
+ (quasiquote (quasiquote (+)))
+ (quasiquote (unquote (+)))
+ (quasiquote (unquote (quote (+))))
+ (quasiquote (unquote (quasiquote (+))))
+ (quasiquote (unquote (quasiquote (unquote (+)))))
+ #reader racket/base (quote pi.f)
+ (quote #reader racket/base pi.f)
+ #reader racket/base (quasiquote pi.f)
+ (quasiquote #reader racket/base pi.f)
+ #reader racket/base (quasiquote (unquote pi.f))
+ (quasiquote #reader racket/base (unquote pi.f))
+ (quasiquote (unquote #reader racket/base pi.f))
+ #reader racket/base (quote (quasiquote (unquote pi.f)))
+ (quote #reader racket/base (quasiquote (unquote pi.f)))
+ (quote (quasiquote #reader racket/base (unquote pi.f)))
+ (quote (quasiquote (unquote #reader racket/base pi.f)))
+ #reader racket/base (quote (*))
+ (quote #reader racket/base (*))
+ #reader racket/base (quasiquote (*))
+ (quasiquote #reader racket/base (*))
+ #reader racket/base (quasiquote (unquote (*)))
+ (quasiquote #reader racket/base (unquote (*)))
+ (quasiquote (unquote #reader racket/base (*)))
+ #reader racket/base (quote (quasiquote (unquote (*))))
+ (quote #reader racket/base (quasiquote (unquote (*))))
+ (quote (quasiquote #reader racket/base (unquote (*))))
+ (quote (quasiquote (unquote #reader racket/base (*))))
+ ;; Make sure non-identifiers work with quotes
+ ' "" pi
+ ' #t pi
+ ' #() pi
+ ' #s(s) pi
+ ' #\u3BB pi
+ ' #\U000003BB pi
+ ' #\space pi
+ ' #\. pi
+ ' #"" pi
+ ' #:kw pi
+ ' #&b pi
+ ' #'(define x 1) pi
+ ' #`(define x #,pi) pi
+ ' #I0 pi
+ ' #E0 pi
+ ' #X0 pi
+ ' #O0 pi
+ ' #D0 pi
+ ' #B0 pi
+ ' #<<EOF
+EOF
+ pi
+ ' #rx"" pi
+ ' #rx#"" pi
+ ' #px"" pi
+ ' #px#"" pi
+ ' #hash() pi
+ ' #hasheq[] pi
+ ' #hasheqv{} pi
+ ' #1(v) pi
)
+
+;; Use the following to generate lists of built-ins and keywords.
+;; Run
+;; (displayln (wrap-lines KEYWORDS))
+;; (displayln (wrap-lines BUILTINS))
+;; and copy the results into RacketLexer._keywords and RacketLexer._builtins.
+
+;; (-> (listof string?) string?)
+;; Appends all the strings together, quoting them as appropriate for Python,
+;; with commas and spaces between them, wrapping at 80 characters, with an
+;; indentation of 8 spaces.
+(define (wrap-lines lst)
+ (define INDENTATION '" ")
+ (define WIDTH '80)
+ (define (wrap-lines* lst done-lines current-line)
+ (if (null? lst)
+ (string-append (foldr string-append "" done-lines) current-line)
+ (let* ([str (first lst)]
+ [wrapped-str (if (regexp-match-exact? '#px"[[:ascii:]]+" str)
+ (string-append "'" str "',")
+ (string-append "u'" str "',"))]
+ [new-line (string-append current-line " " wrapped-str)])
+ (if ((string-length new-line) . >= . WIDTH)
+ (wrap-lines* (rest lst)
+ (append done-lines
+ `(,(string-append current-line "\n")))
+ (string-append INDENTATION wrapped-str))
+ (wrap-lines* (rest lst)
+ done-lines
+ new-line)))))
+ (wrap-lines* lst '() INDENTATION))
+
+;; (-> string? boolean?)
+;; Returns #t if str represents a syntax identifier in the current namespace,
+;; otherwise #f.
+(define (syntax-identifier? str)
+ (with-handlers ([exn? exn?])
+ (not (eval (call-with-input-string str read)))))
+
+(define RACKET-NAMESPACE
+ (parameterize ([current-namespace (make-base-namespace)])
+ (namespace-require 'racket)
+ (current-namespace)))
+
+(define BOUND-IDENTIFIERS
+ (parameterize ([current-namespace RACKET-NAMESPACE])
+ (sort (map symbol->string (namespace-mapped-symbols))
+ string<=?)))
+
+(define-values (KEYWORDS BUILTINS)
+ (parameterize ([current-namespace RACKET-NAMESPACE])
+ (partition syntax-identifier? BOUND-IDENTIFIERS)))
diff --git a/tests/examplefiles/test.r3 b/tests/examplefiles/test.r3
index cad12a8d..707102db 100644
--- a/tests/examplefiles/test.r3
+++ b/tests/examplefiles/test.r3
@@ -1,3 +1,9 @@
+preface.... everything what is before header is not evaluated
+so this should not be colorized:
+1 + 2
+
+REBOL [] ;<- this is minimal header, everything behind it must be colorized
+
;## String tests ##
print "Hello ^"World" ;<- with escaped char
multiline-string: {
@@ -52,15 +58,29 @@ type? #ff0000 ;== issue!
to integer! (1 + (x / 4.5) * 1E-4)
;## some spec comments
-comment now
-comment 10
+1 + 1
+comment "aa"
+2 + 2
+comment {aa}
+3 + 3
+comment {a^{}
+4 + 4
+comment {{}}
+5 + 5
comment {
- bla
- bla
+ foo: 6
}
-comment [
- quit
-]
+6 + 6
+comment [foo: 6]
+7 + 7
+comment [foo: "[" ]
+8 + 8
+comment [foo: {^{} ]
+9 + 9
+comment [foo: {boo} ]
+10 + 10
+comment 5-May-2014/11:17:34+2:00
+5-May-2014/11:17:34+2:00 11 + 11
;## other tests ##
---: 1
diff --git a/tests/examplefiles/vimrc b/tests/examplefiles/vimrc
new file mode 100644
index 00000000..d2f9cd1b
--- /dev/null
+++ b/tests/examplefiles/vimrc
@@ -0,0 +1,21 @@
+" A comment
+
+:py print "py"
+::pyt print 'pyt'
+ pyth print '''pyth'''
+ : pytho print "pytho"
+python print """python"""
+
+ : : python<<E OF
+print """my script"""
+
+def MyFunc(str):
+ """ My Function """
+ print str
+E OF
+
+let py = 42
+echo py
+
+let foo = 42
+echo foo
diff --git a/tests/string_asserts.py b/tests/string_asserts.py
new file mode 100644
index 00000000..025a5281
--- /dev/null
+++ b/tests/string_asserts.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+"""
+ Pygments string assert utility
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+class StringTests(object):
+
+ def assertStartsWith(self, haystack, needle, msg=None):
+ if msg is None:
+ msg = "'{}' does not start with '{}'".format(haystack, needle)
+ if not haystack.startswith(needle):
+ raise(AssertionError(msg))
+
+ def assertEndsWith(self, haystack, needle, msg=None):
+ if msg is None:
+ msg = "'{}' does not end with '{}'".format(haystack, needle)
+ if not haystack.endswith(needle):
+ raise(AssertionError(msg))
diff --git a/tests/test_cfm.py b/tests/test_cfm.py
new file mode 100644
index 00000000..2ff25bd6
--- /dev/null
+++ b/tests/test_cfm.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+"""
+ Basic ColdfusionHtmlLexer Test
+ ~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2014 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import unittest
+import os
+
+from pygments.token import Token
+from pygments.lexers import ColdfusionHtmlLexer
+
+
+class ColdfusionHtmlLexerTest(unittest.TestCase):
+
+ def setUp(self):
+ self.lexer = ColdfusionHtmlLexer()
+
+ def testBasicComment(self):
+ fragment = u'<!--- cfcomment --->'
+ expected = [
+ (Token.Text, u''),
+ (Token.Comment.Multiline, u'<!---'),
+ (Token.Comment.Multiline, u' cfcomment '),
+ (Token.Comment.Multiline, u'--->'),
+ (Token.Text, u'\n'),
+ ]
+ self.assertEqual(expected, list(self.lexer.get_tokens(fragment)))
+
+ def testNestedComment(self):
+ fragment = u'<!--- nested <!--- cfcomment ---> --->'
+ expected = [
+ (Token.Text, u''),
+ (Token.Comment.Multiline, u'<!---'),
+ (Token.Comment.Multiline, u' nested '),
+ (Token.Comment.Multiline, u'<!---'),
+ (Token.Comment.Multiline, u' cfcomment '),
+ (Token.Comment.Multiline, u'--->'),
+ (Token.Comment.Multiline, u' '),
+ (Token.Comment.Multiline, u'--->'),
+ (Token.Text, u'\n'),
+ ]
+ self.assertEqual(expected, list(self.lexer.get_tokens(fragment)))
diff --git a/tests/test_clexer.py b/tests/test_clexer.py
index e359c44e..4aac6d39 100644
--- a/tests/test_clexer.py
+++ b/tests/test_clexer.py
@@ -43,7 +43,7 @@ class CLexerTest(unittest.TestCase):
}
}
'''
- expected = [
+ tokens = [
(Token.Keyword.Type, u'int'),
(Token.Text, u' '),
(Token.Name.Function, u'main'),
@@ -81,7 +81,7 @@ class CLexerTest(unittest.TestCase):
(Token.Punctuation, u'}'),
(Token.Text, u'\n'),
]
- self.assertEqual(expected, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
+ self.assertEqual(tokens, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
def testSwitchSpaceBeforeColon(self):
fragment = u'''\
@@ -95,7 +95,7 @@ class CLexerTest(unittest.TestCase):
}
}
'''
- expected = [
+ tokens = [
(Token.Keyword.Type, u'int'),
(Token.Text, u' '),
(Token.Name.Function, u'main'),
@@ -135,7 +135,7 @@ class CLexerTest(unittest.TestCase):
(Token.Punctuation, u'}'),
(Token.Text, u'\n'),
]
- self.assertEqual(expected, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
+ self.assertEqual(tokens, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
def testLabel(self):
fragment = u'''\
@@ -145,7 +145,7 @@ class CLexerTest(unittest.TestCase):
goto foo;
}
'''
- expected = [
+ tokens = [
(Token.Keyword.Type, u'int'),
(Token.Text, u' '),
(Token.Name.Function, u'main'),
@@ -166,7 +166,7 @@ class CLexerTest(unittest.TestCase):
(Token.Punctuation, u'}'),
(Token.Text, u'\n'),
]
- self.assertEqual(expected, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
+ self.assertEqual(tokens, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
def testLabelSpaceBeforeColon(self):
fragment = u'''\
@@ -176,7 +176,7 @@ class CLexerTest(unittest.TestCase):
goto foo;
}
'''
- expected = [
+ tokens = [
(Token.Keyword.Type, u'int'),
(Token.Text, u' '),
(Token.Name.Function, u'main'),
@@ -198,7 +198,7 @@ class CLexerTest(unittest.TestCase):
(Token.Punctuation, u'}'),
(Token.Text, u'\n'),
]
- self.assertEqual(expected, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
+ self.assertEqual(tokens, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
def testLabelFollowedByStatement(self):
fragment = u'''\
@@ -208,7 +208,7 @@ class CLexerTest(unittest.TestCase):
goto foo;
}
'''
- expected = [
+ tokens = [
(Token.Keyword.Type, u'int'),
(Token.Text, u' '),
(Token.Name.Function, u'main'),
@@ -233,4 +233,4 @@ class CLexerTest(unittest.TestCase):
(Token.Punctuation, u'}'),
(Token.Text, u'\n'),
]
- self.assertEqual(expected, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
+ self.assertEqual(tokens, list(self.lexer.get_tokens(textwrap.dedent(fragment))))
diff --git a/tests/test_rtf_formatter.py b/tests/test_rtf_formatter.py
new file mode 100644
index 00000000..30b136fd
--- /dev/null
+++ b/tests/test_rtf_formatter.py
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+"""
+ Pygments RTF formatter tests
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import unittest
+from string_asserts import StringTests
+
+from pygments.util import StringIO
+from pygments.formatters import RtfFormatter
+from pygments.lexers.special import TextLexer
+
+class RtfFormatterTest(StringTests, unittest.TestCase):
+ foot = (r'\par' '\n' r'}')
+
+ def _escape(self, string):
+ return(string.replace("\n", r"\n"))
+
+ def _build_message(self, *args, **kwargs):
+ string = kwargs.get('string', None)
+ t = self._escape(kwargs.get('t', ''))
+ expected = self._escape(kwargs.get('expected', ''))
+ result = self._escape(kwargs.get('result', ''))
+
+ if string is None:
+ string = (u"The expected output of '{t}'\n"
+ u"\t\tShould be '{expected}'\n"
+ u"\t\tActually outputs '{result}'\n"
+ u"\t(WARNING: Partial Output of Result!)")
+
+ end = -(len(self._escape(self.foot)))
+ start = end-len(expected)
+
+ return string.format(t=t,
+ result = result[start:end],
+ expected = expected)
+
+ def format_rtf(self, t):
+ tokensource = list(TextLexer().get_tokens(t))
+ fmt = RtfFormatter()
+ buf = StringIO()
+ fmt.format(tokensource, buf)
+ result = buf.getvalue()
+ buf.close()
+ return result
+
+ def test_rtf_header(self):
+ t = u''
+ result = self.format_rtf(t)
+ expected = r'{\rtf1\ansi\uc0'
+ msg = (u"RTF documents are expected to start with '{expected}'\n"
+ u"\t\tStarts intead with '{result}'\n"
+ u"\t(WARNING: Partial Output of Result!)".format(
+ expected = expected,
+ result = result[:len(expected)]))
+ self.assertStartsWith(result, expected, msg)
+
+ def test_rtf_footer(self):
+ t = u''
+ result = self.format_rtf(t)
+ expected = self.foot
+ msg = (u"RTF documents are expected to end with '{expected}'\n"
+ u"\t\tEnds intead with '{result}'\n"
+ u"\t(WARNING: Partial Output of Result!)".format(
+ expected = self._escape(expected),
+ result = self._escape(result[-len(expected):])))
+ self.assertEndsWith(result, expected, msg)
+
+ def test_ascii_characters(self):
+ t = u'a b c d ~'
+ result = self.format_rtf(t)
+ expected = (r'a b c d ~')
+ if not result.endswith(self.foot):
+ return(unittest.skip('RTF Footer incorrect'))
+ msg = self._build_message(t=t, result=result, expected=expected)
+ self.assertEndsWith(result, expected+self.foot, msg)
+
+ def test_escape_characters(self):
+ t = u'\ {{'
+ result = self.format_rtf(t)
+ expected = (r'\\ \{\{')
+ if not result.endswith(self.foot):
+ return(unittest.skip('RTF Footer incorrect'))
+ msg = self._build_message(t=t, result=result, expected=expected)
+ self.assertEndsWith(result, expected+self.foot, msg)
+
+ def test_single_characters(self):
+ t = u'â € ¤ каждой'
+ result = self.format_rtf(t)
+ expected = (r'{\u226} {\u8364} {\u164} '
+ r'{\u1082}{\u1072}{\u1078}{\u1076}{\u1086}{\u1081}')
+ if not result.endswith(self.foot):
+ return(unittest.skip('RTF Footer incorrect'))
+ msg = self._build_message(t=t, result=result, expected=expected)
+ self.assertEndsWith(result, expected+self.foot, msg)
+
+ def test_double_characters(self):
+ t = u'က 힣 ↕ ↕︎ 鼖'
+ result = self.format_rtf(t)
+ expected = (r'{\u4096} {\u55203} {\u8597} '
+ r'{\u8597}{\u65038} {\u55422}{\u56859}')
+ if not result.endswith(self.foot):
+ return(unittest.skip('RTF Footer incorrect'))
+ msg = self._build_message(t=t, result=result, expected=expected)
+ self.assertEndsWith(result, expected+self.foot, msg)
diff --git a/tests/test_string_asserts.py b/tests/test_string_asserts.py
new file mode 100644
index 00000000..0beed15c
--- /dev/null
+++ b/tests/test_string_asserts.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+"""
+ Pygments string assert utility tests
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import unittest
+from string_asserts import StringTests
+
+class TestStringTests(StringTests, unittest.TestCase):
+
+ def test_startswith_correct(self):
+ self.assertStartsWith("AAA", "A")
+
+ # @unittest.expectedFailure not supported by nose
+ def test_startswith_incorrect(self):
+ with self.assertRaises(AssertionError):
+ self.assertStartsWith("AAA", "B")
+
+ # @unittest.expectedFailure not supported by nose
+ def test_startswith_short(self):
+ with self.assertRaises(AssertionError):
+ self.assertStartsWith("A", "AA")
+
+ def test_endswith_correct(self):
+ self.assertEndsWith("AAA", "A")
+
+ # @unittest.expectedFailure not supported by nose
+ def test_endswith_incorrect(self):
+ with self.assertRaises(AssertionError):
+ self.assertEndsWith("AAA", "B")
+
+ # @unittest.expectedFailure not supported by nose
+ def test_endswith_short(self):
+ with self.assertRaises(AssertionError):
+ self.assertEndsWith("A", "AA")