require 'spec_helper'
require_dependency 'js_locale_helper'

describe JsLocaleHelper do
  it 'should be able to generate translations' do
    JsLocaleHelper.output_locale('en').length.should > 0
  end

  def setup_message_format(format)
    @ctx = V8::Context.new
    @ctx.eval('MessageFormat = {locale: {}};')
    @ctx.load(Rails.root + 'lib/javascripts/locale/en.js')
    compiled = JsLocaleHelper.compile_message_format('en', format)
    @ctx.eval("var test = #{compiled}")
  end

  def localize(opts)
    @ctx.eval("test(#{opts.to_json})")
  end

  it 'handles plurals' do
    setup_message_format('{NUM_RESULTS, plural,
            one {1 result}
          other {# results}
        }')
    localize(NUM_RESULTS: 1).should == '1 result'
    localize(NUM_RESULTS: 2).should == '2 results'
  end

  it 'handles double plurals' do
    setup_message_format('{NUM_RESULTS, plural,
            one {1 result}
          other {# results}
        } and {NUM_APPLES, plural,
            one {1 apple}
          other {# apples}
        }')


    localize(NUM_RESULTS: 1, NUM_APPLES: 2).should == '1 result and 2 apples'
    localize(NUM_RESULTS: 2, NUM_APPLES: 1).should == '2 results and 1 apple'
  end

  it 'handles select' do
    setup_message_format('{GENDER, select, male {He} female {She} other {They}} read a book')
    localize(GENDER: 'male').should == 'He read a book'
    localize(GENDER: 'female').should == 'She read a book'
    localize(GENDER: 'none').should == 'They read a book'
  end

  it 'can strip out message formats' do
    hash = {"a" => "b", "c" => { "d" => {"f_MF" => "bob"} }}
    JsLocaleHelper.strip_out_message_formats!(hash).should == {"c.d.f_MF" => "bob"}
    hash["c"]["d"].should == {}
  end

  it 'handles message format special keys' do
    ctx = V8::Context.new
    ctx.eval("I18n = {};")
    ctx.eval(JsLocaleHelper.output_locale('en',
    {
      "en" =>
      {
        "js" => {
          "hello" => "world",
          "test_MF" => "{HELLO} {COUNT, plural, one {1 duck} other {# ducks}}",
          "error_MF" => "{{BLA}",
          "simple_MF" => "{COUNT, plural, one {1} other {#}}"
        }
      }
    }))

    ctx.eval('I18n.translations')["en"]["js"]["hello"].should == "world"
    ctx.eval('I18n.translations')["en"]["js"]["test_MF"].should == nil

    ctx.eval('I18n.messageFormat("test_MF", { HELLO: "hi", COUNT: 3 })').should == "hi 3 ducks"
    ctx.eval('I18n.messageFormat("error_MF", { HELLO: "hi", COUNT: 3 })').should =~ /Invalid Format/
    ctx.eval('I18n.messageFormat("missing", {})').should =~ /missing/
    ctx.eval('I18n.messageFormat("simple_MF", {})').should =~ /COUNT/ # error
  end

  it 'load pluralizations rules before precompile' do
    message = JsLocaleHelper.compile_message_format('ru', 'format')
    message.should_not match 'Plural Function not found'
  end

  LocaleSiteSetting.values.each do |locale|
    it "generates valid date helpers for #{locale[:value]} locale" do
      js = JsLocaleHelper.output_locale(locale[:value])
      ctx = V8::Context.new
      ctx.eval('var window = this;')
      ctx.load(Rails.root + 'app/assets/javascripts/locales/i18n.js')
      ctx.eval(js)
    end
  end

end