/*
* Copyright 2012 The Closure Compiler Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.javascript.jscomp;
import static com.google.javascript.jscomp.JsMessage.Style.RELAX;
import com.google.javascript.jscomp.JsMessage.Style;
/**
* Test which checks that replacer works correctly.
*
* @author tbreisacher@google.com (Tyler Breisacher)
*/
public final class ReplaceMessagesForChromeTest extends CompilerTestCase {
private Style style = RELAX;
@Override
protected CompilerPass getProcessor(Compiler compiler) {
return new ReplaceMessagesForChrome(compiler,
new GoogleJsMessageIdGenerator(null), false, style);
}
@Override
protected int getNumRepetitions() {
// No longer valid on the second run.
return 1;
}
@Override
protected void setUp() throws Exception {
super.setUp();
style = RELAX;
}
public void testReplaceSimpleMessage() {
test(
LINE_JOINER.join(
"/** @desc A simple message. */\n", "var MSG_A = goog.getMsg('Hello world');"),
LINE_JOINER.join(
"/** @desc A simple message. */\n",
"var MSG_A=chrome.i18n.getMessage('8660696502365331902');"));
test(
LINE_JOINER.join(
"/** @desc A message attached to an object. */\n",
"foo.bar.MSG_B = goog.getMsg('Goodbye world');"),
LINE_JOINER.join(
"/** @desc A message attached to an object. */\n",
"foo.bar.MSG_B=chrome.i18n.getMessage('2356086230621084760');"));
}
public void testReplaceSinglePlaceholder() {
test(
LINE_JOINER.join(
"/** @desc A message with one placeholder. */\n",
"var MSG_C = goog.getMsg('Hello, {$name}', {name: 'Tyler'});"),
LINE_JOINER.join(
"/** @desc A message with one placeholder. */\n",
"var MSG_C=chrome.i18n.getMessage('4985325380591528435', ['Tyler']);"));
}
public void testReplaceTwoPlaceholders() {
test(
LINE_JOINER.join(
"/** @desc A message with two placeholders. */\n",
"var MSG_D = goog.getMsg('{$greeting}, {$name}', ",
"{greeting: 'Hi', name: 'Tyler'});"),
LINE_JOINER.join(
"/** @desc A message with two placeholders. */\n",
"var MSG_D=chrome.i18n.getMessage('3605047247574980322', ",
"['Hi', 'Tyler']);"));
test(
LINE_JOINER.join(
"/** @desc A message with two placeholders, but their order is\n",
" * reversed in the object literal. (Shouldn't make a difference.)\n",
" */\n",
"var MSG_E = goog.getMsg('{$greeting}, {$name}!', ",
"{name: 'Tyler', greeting: 'Hi'});"),
LINE_JOINER.join(
"/** @desc A message with two placeholders, but their order is\n",
" * reversed in the object literal. (Shouldn't make a difference.)\n",
" */\n",
"var MSG_E=chrome.i18n.getMessage('691522386483664339', ",
"['Hi', 'Tyler']);"));
}
public void testReplacePlaceholderMissingValue() {
testError("/** @desc A message with two placeholders, but one is missing. */\n"
+ "var MSG_F = goog.getMsg('{$greeting}, {$name}!', {name: 'Tyler'});",
JsMessageVisitor.MESSAGE_TREE_MALFORMED);
}
public void testReplaceTwoPlaceholdersNonAlphaOrder() {
test(
LINE_JOINER.join(
"/** @desc A message with two placeholders not in order .*/\n",
"var MSG_G = goog.getMsg('{$name}: {$greeting}', ",
"{greeting: 'Salutations', name: 'Tyler'});"),
LINE_JOINER.join(
"/** @desc A message with two placeholders not in order .*/\n",
"var MSG_G=chrome.i18n.getMessage('7437383242562773138', ",
"['Salutations', 'Tyler']);"));
}
public void testReplaceExternalMessage() {
test(
LINE_JOINER.join(
"/** @desc A message that was extracted with SoyMsgExtractor. */\n",
"var MSG_EXTERNAL_1357902468 = goog.getMsg('Hello world');"),
LINE_JOINER.join(
"/** @desc A message that was extracted with SoyMsgExtractor. */\n",
"var MSG_EXTERNAL_1357902468 = chrome.i18n.getMessage('1357902468');"));
}
/**
* Test that messages are handled correctly if they contain the same
* placeholder twice.
*/
public void testReplaceMessageWithDuplicatePlaceholders() {
test(
LINE_JOINER.join(
"/** @desc A message that contains two instances of the same placeholder. */\n",
"var MSG_EXTERNAL_987654321 = goog.getMsg(",
"'{$startDiv_1}You are signed in as{$endDiv}{$img}{$startDiv_2}{$name}{$endDiv}',",
"{'startDiv_1': '<div>',",
"'endDiv': '</div>',",
"'img': '<img src=\"http://example.com/photo.png\">',",
"'startDiv_2': '<div class=\"name\">',",
"'name': name});"),
LINE_JOINER.join(
"/** @desc A message that contains two instances of the same placeholder. */\n",
"var MSG_EXTERNAL_987654321 = chrome.i18n.getMessage('987654321', ",
"[",
"'</div>', ", // endDiv, only included once even though it appears twice in the message.
"'<img src=\"http://example.com/photo.png\">', ", // img
"name, ", // name
"'<div>', ", // startDiv_1
"'<div class=\"name\">'", // startDiv_2
"]);"));
}
}