2011-01-30 3 views
6

ユニットがASCII文字列をUnicode文字に変換するコードをテストしているときに、Clojureテストの出力に問題が見つかりました。Unicode Clojure unitテスト出力

私は自分の端末が(テストファイルをキャッチして)ユニコード文字を出力できることをテストしました。それはうまく動作するので、問題は何とかleiningen、Clojureまたはclojure.testに関係しているようです。ここで

は、サンプルテストです(ユニコードのギリシャのセクションを使用して - 私はまた、ギリシャの拡張を使用することになりますが、私は同じ問題が適用されると仮定):

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

は、原因不足しているスペースに失敗することが意図されます入力にlein testの出力は次のとおりです。

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. 

私はここで間違っていますか?これは端末のエミュレーションの問題なのでしょうか?私はSlime/swank/emacsでREPLのコードを実行するのと同じ問題を抱えています。 emacsのREPLはユニコード出力の疑問符を出力します(ただし、emacsはユニコードを理解することは可能です)。

私はTerminalとiTerm(OS X)で同じ結果を試してみました。

答えて

5

それはあなたがこのように、*out*ので、Unicodeの作品の出力エンコーディングを強制的にJavaへのオプションを渡すことができることが判明:

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 

私はLeiningenをを使用していたように、私は私のプロジェクトに、このプロパティを追加しました。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

ああ男!私はこの答えのためにあなたを愛しています。私はコードが間違っていると思って夢中になっていた! – Scott

3

のClojure自体は(これは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=> 

しかし、それは時のemacs /スワンク/ Clojureの-のmaven-pluginの/ mavenの

を破るん私はMavenを使用する場合は

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

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

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

、簡単な以下のPOMファイル、およびMVNのClojureのは::emacsの中REPLが、それは大丈夫だREPL:

[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=> 

が、私はこのスニペットを使用してjlineライブラリを追加した場合:

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

その後、私が手:

[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=> 

ひどくあなたのエラーのように見えますどの。ですから、問題はjLine、またはjLineに関連付けられているLeiningenとmavenが共通する他の部分にある可能性があります。

もちろん、2つの独立したユニコード関連の障害が存在する可能性があります。

これは誰でもこれをデバッグしようとしている場合のための私のmaven pom.xmlファイルです。

<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> 

これは答えではありませんが、参考になると思います。

+0

私は何が起こるかを見るために同様のことを試みました。興味深いことに、REPLで行ったようにテストを実行するとうまくいきますが、同じテストをjavaから直接実行することはできません。したがって、 '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' < - "???"を生成する実行 –

+0

これはこれを引き起こしているLeiningenではなく、Maven(asaik)でもないが、clojure.testが標準出力に印刷すると失敗を出力する方法と思われる。 –

+0

そうでないかもしれない:( "期待" のprintln(PR-STR(:予想メートル))) ':(プリントは "αβγ")も、これは失敗を出力するコードで変な文字 –

関連する問題