2011-01-30 7 views
6

Cuando la unidad prueba algún código que traduce secuencias ASCII en caracteres Unicode, he encontrado un problema con la salida de las pruebas Clojure.Salida de prueba de la unidad Unicode Clojure

He probado que mi terminal puede generar caracteres Unicode (por cating los archivos de prueba) y que funciona bien, por lo que el problema parece estar relacionado con leiningen, Clojure o clojure.test de alguna manera.

Aquí es una prueba (usando la sección griega de Unicode - También estaré usando extendida griega pero supongo se aplicarán los mismos problemas):

(deftest bc-string-w-comma 
    (is (= "αβγ, ΑΒΓ" (parse "abg,*a*b*g")))) 

que está destinado a fallar debido al espacio que falta en la entrada. La salida de lein test es la siguiente:

Testing parse_perseus.test.betacode 
FAIL in (bc-string-w-comma) (betacode.clj:15) 
expected: (= "???, ???" (parse "abg,*a*b*g")) 
    actual: (not (= "???, ???" "???,???")) 
Testing parse_perseus.test.core 
Testing parse_perseus.test.pluralise 
Ran 10 tests containing 59 assertions. 
1 failures, 0 errors. 

¿qué estoy haciendo mal aquí? ¿Es este un problema de emulación terminal o algo relacionado con Clojure? Tengo el mismo problema al ejecutar el código en REPL con Slime/swank/emacs. El REPL en emacs solo emite signos de interrogación para la salida de unicode (aunque emacs es bastante capaz de entender unicode).

He intentado ejecutar esto en Terminal y iTerm (OS X) con los mismos resultados.

Respuesta

5

Resulta que se puede pasar opciones de Java para forzar la codificación de salida de *out* para que las obras Unicode, así:

java -Dfile.encoding=utf-8 -cp lib/clojure-1.2.0.jar:lib/clojure-contrib-1.2.0.jar clojure.main -i src/whatever.clj 

Como estoy usando Leiningen, he añadido esta propiedad a mi proyecto .archivo clj:

(defproject project_name "1.0.0-SNAPSHOT" 
    :description "A Clojure Project" 
    :dependencies [[org.clojure/clojure "1.2.0"] 
       [org.clojure/clojure-contrib "1.2.0"]] 
    :dev-dependencies [[swank-clojure "1.2.0"]] 
    :jvm-opts ["-Dfile.encoding=utf-8"]) 
+0

¡Oh hombre! Te amo por esta respuesta. ¡Me estaba volviendo loca pensando que mi código estaba equivocado! – Scott

3

Clojure en sí parece en la clara (esto es Ubuntu 10.10, gnome-terminal, OpenJDK):

[email protected]$ java -cp /home/john/.m2/repository/org/clojure/clojure/1.2.0/clojure-1.2.0.jar:/home/john/.m2/repository/org/clojure/clojure-contrib/1.2.0/clojure-contrib-1.2.0.jar clojure.main 
Clojure 1.2.0 
user=> (use 'clojure.test) 
nil 
user=> (defn parse [s] "αβγ,ΑΒΓ") 
#'user/parse 
user=> (deftest greek (is (= "αβγ, ΑΒΓ" (parse "")))) 
#'user/greek 
user=> (run-tests) 

Testing user 

FAIL in (greek) (NO_SOURCE_FILE:3) 
expected: (= "αβγ, ΑΒΓ" (parse "")) 
    actual: (not (= "αβγ, ΑΒΓ" "αβγ,ΑΒΓ")) 

Ran 1 tests containing 1 assertions. 
1 failures, 0 errors. 
{:type :summary, :test 1, :pass 0, :fail 1, :error 0} 
user=> 

Pero lo hace romper emacs/Swank/clojure-experto-plugin/experto

en REPL en emacs:

> (is "αβγ""αβγ") 

slime-net-send: Coding system iso-latin-1-unix not suitable for "000052(:emacs-rex (swank:listener-eval \"(is \\\"αβγ\\\"\\\"αβγ\\\") 

\") \"user\" :repl-thread 33) 
" 

Si uso experto, el simple fichero pom abajo, y clojure mvn: repl entonces está bien:

[INFO] [clojure:repl {execution: default-cli}] 
Clojure 1.2.0 
user=> (use 'clojure.test) (is "αβγ""αβγ") 
nil 
"αβγ" 
user=> (defn parse [s] "αβγ,ΑΒΓ") 
#'user/parse 
user=> (deftest greek (is (= "αβγ, ΑΒΓ" (parse "")))) 
#'user/greek 
user=> (run-tests) 

Testing user 

FAIL in (greek) (NO_SOURCE_FILE:3) 
expected: (= "αβγ, ΑΒΓ" (parse "")) 
    actual: (not (= "αβγ, ΑΒΓ" "αβγ,ΑΒΓ")) 

Ran 1 tests containing 1 assertions. 
1 failures, 0 errors. 
{:type :summary, :test 1, :pass 0, :fail 1, :error 0} 
user=> 

pero si añado la biblioteca jline utilizando este fragmento:

<dependency> 
    <groupId>jline</groupId> 
    <artifactId>jline</artifactId> 
    <version>0.9.94</version> 
</dependency> 

en cuando me siento:

[INFO] [clojure:repl {execution: default-cli}] 
[INFO] Enabling JLine support 
Clojure 1.2.0 
user=> (use 'clojure.test) (is "αβγ""αβγ") 
nil 
"���" 
user=> (defn parse [s] "αβγ,ΑΒΓ") 
#'user/parse 
user=> (deftest greek (is (= "αβγ, ΑΒΓ" (parse "")))) 
#'user/greek 
user=> (run-tests) 

Testing user 

FAIL in (greek) (NO_SOURCE_FILE:3) 
expected: (= "���, ���" (parse "")) 
    actual: (not (= "���, ���" "���,���")) 

Ran 1 tests containing 1 assertions. 
1 failures, 0 errors. 
{:type :summary, :test 1, :pass 0, :fail 1, :error 0} 
user=> 

que se parece terriblemente al igual que su error. Por lo tanto, es posible que el problema esté en jLine, o en alguna otra pieza que Leiningen y maven tengan en común y que esté asociada con jLine.

O, por supuesto, puede haber dos fallas independientes relacionadas con unicode.

Aquí está mi archivo maven pom.xml en caso de que alguien esté tratando de depurar esto.

<project> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.aspden</groupId> 
    <artifactId>maven-clojure-simple</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <name>maven-clojure-simple</name> 
    <description>maven, clojure: simple project</description> 

    <repositories> 

    <repository> 
     <id>clojure</id> 
     <url>http://build.clojure.org/releases</url> 
    </repository> 
    <repository> 
     <id>central</id> 
     <url>http://repo1.maven.org/maven2</url> 
    </repository> 
    </repositories> 

    <dependencies> 
    <dependency> 
     <groupId>org.clojure</groupId> 
     <artifactId>clojure</artifactId> 
     <version>1.2.0</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
    <groupId>com.theoryinpractise</groupId> 
    <artifactId>clojure-maven-plugin</artifactId> 
    <version>1.3.5-SNAPSHOT</version> 
     </plugin> 
    </plugins> 
    </build> 

</project> 

Aprecio que esta no es una respuesta, pero pensé que podría ser útil.

+0

He intentado hacer algo similar para ver qué pasa. Curiosamente, ejecutar las pruebas como lo hizo en el REPL funciona bien, pero ejecutar las mismas pruebas directamente desde Java no funciona. Así 'java -cp lib/clojure-1.2.0.jar: lib/clojure-contrib-1.2.0.jar: lib/fnparse-2.2.7.jar: src/clojure.main -i test/parse_perseus/test/betacode.clj' <- running que produce "???" –

+0

Esto significa que no es Leiningen lo que está causando esto, ni tampoco es Maven (asaik), pero parece ser la forma en que clojure.test imprime fallas si se imprime para salir estándar. –

+0

Quizás no: (imprimir "αβγ") también produce caracteres divertidos –