Added get-message function, with simpler parameters.

Also brought up to date, and fixed some stylistic errors noted by Kondo, and set the default locale to the runtime default locale.
This commit is contained in:
Simon Brooke 2023-01-04 19:42:41 +00:00
parent 47396aa261
commit e2e06d0244
No known key found for this signature in database
GPG key ID: A7A4F18D1D4DF987
21 changed files with 2073 additions and 239 deletions

View file

@ -1,7 +1,12 @@
(ns ^{:doc "Tests for Internationalisation."
:author "Simon Brooke"} scot.weft.i18n.test.core
(:require [clojure.test :refer :all]
[scot.weft.i18n.core :refer :all]))
(:require [clojure.test :refer [deftest is testing]]
[scot.weft.i18n.core :refer [*default-language*
acceptable-languages
generate-accept-languages
get-message
get-messages
parse-accept-language-header]]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
@ -14,174 +19,173 @@
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(deftest test-generator
(testing "Generating normalised maps from parse trees"
(is
(=
0.6
(generate-accept-languages
[:Q-VALUE "0.6"])))
(=
0.6
(generate-accept-languages
[:Q-VALUE "0.6"])))
(is
(=
{:language "en", :qualifier "*"}
(generate-accept-languages
[:PRIMARY-TAG "en"])))
(=
{:language "en", :qualifier "*"}
(generate-accept-languages
[:PRIMARY-TAG "en"])))
(is
(=
{:language "en", :qualifier "*"}
(generate-accept-languages
(=
{:language "en", :qualifier "*"}
(generate-accept-languages
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]])))
(is
(=
{:language "en", :qualifier "*", :preference 1}
(generate-accept-languages
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]]])))
(is
(=
{:language "en", :qualifier "GB", :preference 1}
(generate-accept-languages
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "GB"]]]])))
(is
(=
'({:language "en", :qualifier "GB", :preference 1})
(generate-accept-languages
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "GB"]]]]])))
(is
(=
'({:language "en", :qualifier "US", :preference 0.8}
{:language "en", :qualifier "*", :preference 0.6})
(generate-accept-languages
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "US"]]]
";q="
[:Q-VALUE "0.8"]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]])))
[:PRIMARY-TAG "en"]]
";q="
[:Q-VALUE "0.6"]]]])))
(is
(=
{:language "en", :qualifier "*", :preference 1}
(generate-accept-languages
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]]])))
(is
(=
{:language "en", :qualifier "GB", :preference 1}
(generate-accept-languages
(=
'({:language "en", :qualifier "GB", :preference 1}
{:language "en", :qualifier "US", :preference 0.8}
{:language "en", :qualifier "*", :preference 0.6})
(generate-accept-languages
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "GB"]]]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "GB"]]]])))
(is
(=
'({:language "en", :qualifier "GB", :preference 1})
(generate-accept-languages
[:SUB-TAG "US"]]]
";q="
[:Q-VALUE "0.8"]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "GB"]]]]])))
(is
(=
'({:language "en", :qualifier "US", :preference 0.8}
{:language "en", :qualifier "*", :preference 0.6})
(generate-accept-languages
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "US"]]]
[:PRIMARY-TAG "en"]]
";q="
[:Q-VALUE "0.8"]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]]
";q="
[:Q-VALUE "0.6"]]]])))
(is
(=
'({:language "en", :qualifier "GB", :preference 1}
{:language "en", :qualifier "US", :preference 0.8}
{:language "en", :qualifier "*", :preference 0.6})
(generate-accept-languages
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "GB"]]]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS
[:SUB-TAG "US"]]]
";q="
[:Q-VALUE "0.8"]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]]
";q="
[:Q-VALUE "0.6"]]]]]])))))
[:Q-VALUE "0.6"]]]]]])))))
(deftest test-parser
(testing "Generating parse trees from `Accept-Language` headers"
(is
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "dk"]]]]]
(parse-accept-language-header "dk"))
"Should accept a basic language specifier.")
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "dk"]]]]]
(parse-accept-language-header "dk"))
"Should accept a basic language specifier.")
(is
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS [:SUB-TAG "GB"]]]]]]
(parse-accept-language-header "en-GB"))
"Should accept a basic locale.")
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS [:SUB-TAG "GB"]]]]]]
(parse-accept-language-header "en-GB"))
"Should accept a basic locale.")
(is
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS [:SUB-TAG "GB"]]]
[:Q-SEP ";q="]
[:Q-VALUE "0.6"]]]]
(parse-accept-language-header "en-GB;q=0.6"))
"Should accept a q value.")
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS [:SUB-TAG "GB"]]]
[:Q-SEP ";q="]
[:Q-VALUE "0.6"]]]]
(parse-accept-language-header "en-GB;q=0.6"))
"Should accept a q value.")
(is
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS [:SUB-TAG "GB"]]]
[:Q-SEP "; q="]
[:Q-VALUE "0.6"]]]]
(parse-accept-language-header "en-GB; q=0.6"))
"Space after semi-colon should be tolerated.")
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER
[:LANGUAGE-TAG
[:PRIMARY-TAG "en"]
"-"
[:SUB-TAGS [:SUB-TAG "GB"]]]
[:Q-SEP "; q="]
[:Q-VALUE "0.6"]]]]
(parse-accept-language-header "en-GB; q=0.6"))
"Space after semi-colon should be tolerated.")
(is
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "en"]]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "fr"]]]]]]
(parse-accept-language-header "en,fr"))
"Should accept multiple specifications.")
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "en"]]]
[:SPEC-SEP ","]
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "fr"]]]]]]
(parse-accept-language-header "en,fr"))
"Should accept multiple specifications.")
(is
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "en"]]]
[:SPEC-SEP ", "]
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "fr"]]]]]]
(parse-accept-language-header "en, fr"))
"Space after comma should be tolerated.")
(=
[:HEADER
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "en"]]]
[:SPEC-SEP ", "]
[:SPECIFIERS
[:SPECIFIER [:LANGUAGE-TAG [:PRIMARY-TAG "fr"]]]]]]
(parse-accept-language-header "en, fr"))
"Space after comma should be tolerated.")
(is (vector? (parse-accept-language-header "en, fr"))
"If the header is valid, we should get a (parse tree) vector")
(is (not (vector? (parse-accept-language-header "")))
@ -191,23 +195,29 @@
(deftest test-ordering
(testing "Languages specified are ordered correctly"
(is
(=
'({:language "en", :qualifier "GB", :preference 1}
{:language "en", :qualifier "AU", :preference 0.8}
{:language "en", :qualifier "US", :preference 0.6})
(acceptable-languages "en-AU;q=0.8, en-GB, en-US;q=0.6")))))
(=
'({:language "en", :qualifier "GB", :preference 1}
{:language "en", :qualifier "AU", :preference 0.8}
{:language "en", :qualifier "US", :preference 0.6})
(acceptable-languages "en-AU;q=0.8, en-GB, en-US;q=0.6")))))
(deftest test-pipe
(testing "Top level functionality"
(is
(=
"This is not a pipe"
(:pipe (get-messages "en-GB, fr-FR;q=0.9" "i18n" "en-GB"))))
(=
"This is not a pipe"
(:pipe (get-messages "en-GB, fr-FR;q=0.9" "i18n" "en-GB"))))
(is
(=
"Ceci n'est pas une pipe."
(:pipe (get-messages "en-GB;q=0.9, fr-FR" "i18n" "en-GB"))))
(=
"Ceci n'est pas une pipe."
(:pipe (get-messages "en-GB;q=0.9, fr-FR" "i18n" "en-GB"))))
(is
(= nil (get-messages "xx-XX;q=0.5, yy-YY" "i18n" "zz-ZZ"))
"If no usable file is found, an exception should not be thrown.")))
(= nil (get-messages "xx-XX;q=0.5, yy-YY" "i18n" "zz-ZZ"))
"If no usable file is found, an exception should not be thrown.")
(binding [*default-language* "en-GB"]
(is (= "This is not a pipe" (get-message :pipe)))
(is
(=
"Ceci n'est pas une pipe." (get-message :pipe "en-GB;q=0.9, fr-FR")))
(is (= "это не труба." (get-message :pipe "de-DE" "i18n" "ru"))))))