Вопрос

При модульном тестировании некоторого кода, который переводит последовательности ascii в символы Unicode, я обнаружил проблему с выводом тестов Clojure.

Я проверил, что мой терминал может выводить символы Юникода (путем добавления тестовых файлов), и это работает нормально, поэтому проблема каким-то образом связана с leiningen, Clojure или clojure.test.

Вот пример теста (с использованием греческого раздела Unicode - я также буду использовать расширенный греческий язык, но предполагаю, что будут возникать те же проблемы):

родовое слово

Это означает сбой из-за отсутствия места во входных данных. Вывод кода lein test следующий:

родовое слово

Что я здесь делаю не так? Это проблема с эмуляцией терминала или что-то связанное с закрытием? У меня такая же проблема с запуском кода в REPL со Slime / swank / emacs. REPL в emacs выводит вопросительные знаки только для вывода в Unicode (хотя emacs вполне способен понимать Unicode).

Я пробовал запустить это в Терминале и iTerm (OS X) с теми же результатами.

Это было полезно?

Решение

It turns out that you can pass options to java to force the output encoding of *out* so that unicode works, like this:

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

As I'm using Leiningen, I added this property to my project.clj file:

(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"])

Другие советы

Clojure itself seems in the clear (this is Ubuntu 10.10, gnome-terminal, OpenJDK):

john@woc-desktop$ 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=> 

But it does break emacs/swank/clojure-maven-plugin/maven

at REPL in 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)
"

If I use maven, the simple pom file below, and mvn clojure:repl then it's ok:

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

but if I add the jline library using this snippet:

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

then I get:

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

Which looks awfully like your error. So it may be that the problem is in jLine, or some other piece which Leiningen and maven have in common which is associated with jLine.

Or of course, there may be two independent unicode-related failures.

Here is my maven pom.xml file in case anyone is trying to debug this.

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

I appreciate this is not an answer, but i thought it might be helpful.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top