1package org.robolectric.res;
2
3import static org.assertj.core.api.Assertions.assertThat;
4
5import java.io.StringReader;
6import javax.xml.stream.XMLInputFactory;
7import javax.xml.stream.XMLStreamException;
8import javax.xml.stream.XMLStreamReader;
9import org.junit.Before;
10import org.junit.Test;
11import org.junit.runner.RunWith;
12import org.junit.runners.JUnit4;
13import org.robolectric.res.android.ResTable_config;
14
15@RunWith(JUnit4.class)
16public class StaxValueLoaderTest {
17
18  private PackageResourceTable resourceTable;
19  private NodeHandler topLevelNodeHandler;
20  private StaxDocumentLoader staxDocumentLoader;
21
22  @Before
23  public void setUp() throws Exception {
24    resourceTable = new PackageResourceTable("pkg");
25
26    topLevelNodeHandler = new NodeHandler();
27    staxDocumentLoader = new StaxDocumentLoader("pkg", null, topLevelNodeHandler);
28  }
29
30  @Test
31  public void ignoresXliffTags() throws Exception {
32    topLevelNodeHandler.addHandler("resources", new NodeHandler()
33        .addHandler("string", new StaxValueLoader(resourceTable, "string", ResType.CHAR_SEQUENCE))
34    );
35
36    parse("<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">" +
37        "<string name=\"preposition_for_date\">on <xliff:g id=\"date\" example=\"May 29\">%s</xliff:g></string>" +
38        "</resources>");
39
40    assertThat(resourceTable.getValue(new ResName("pkg:string/preposition_for_date"), new ResTable_config()).getData())
41        .isEqualTo("on %s");
42  }
43
44  @Test
45  public void ignoresBTags() throws Exception {
46    topLevelNodeHandler.addHandler("resources", new NodeHandler()
47        .addHandler("item[@type='string']", new StaxValueLoader(resourceTable, "string", ResType.CHAR_SEQUENCE))
48    );
49
50    parse("<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">" +
51        "<item type=\"string\" name=\"sms_short_code_details\">This <b>may cause charges</b> on your mobile account.</item>" +
52        "</resources>");
53
54    assertThat(resourceTable.getValue(new ResName("pkg:string/sms_short_code_details"), new ResTable_config()).getData())
55        .isEqualTo("This may cause charges on your mobile account.");
56  }
57
58  private void parse(String xml) throws XMLStreamException {
59    XMLInputFactory factory = XMLInputFactory.newFactory();
60    XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(new StringReader(xml));
61    FsFile fsFile = Fs.fileFromPath("/tmp/fake.txt");
62    Qualifiers qualifiers = Qualifiers.fromParentDir(fsFile.getParent());
63    staxDocumentLoader.doParse(xmlStreamReader, new XmlContext("pkg",
64        fsFile, qualifiers));
65  }
66}