1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package org.apache.harmony.tests.java.text;
19
20import java.text.AttributedCharacterIterator;
21import java.text.FieldPosition;
22import java.text.Format;
23import java.text.AttributedCharacterIterator.Attribute;
24import java.util.Collections;
25import java.util.Iterator;
26import java.util.Vector;
27import junit.framework.TestCase;
28
29public class Support_Format extends TestCase {
30
31  protected String text;
32
33  public Support_Format(String p1) {
34    super(p1);
35  }
36
37  protected void t_FormatWithField(int count, Format format, Object object,
38                                   String text, Format.Field field, int begin, int end) {
39    StringBuffer buffer = new StringBuffer();
40    FieldPosition pos = new FieldPosition(field);
41    format.format(object, buffer, pos);
42
43    // System.out.println(buffer);
44    // System.out.println(pos);
45
46    if (text == null) {
47      assertEquals("Test " + count + ": incorrect formatted text", this.text, buffer.toString());
48    } else {
49      assertEquals(text, buffer.toString());
50    }
51
52    if (begin != pos.getBeginIndex() || end != pos.getEndIndex()) {
53      assertEquals(field + " " + begin + ".." + end,
54                   pos.getFieldAttribute() + " " + pos.getBeginIndex() + ".." + pos.getEndIndex());
55    }
56  }
57
58  protected void t_Format(int count, Object object, Format format, Vector<FieldContainer> expectedResults) {
59    Vector<FieldContainer> results = findFields(format.formatToCharacterIterator(object));
60    assertEquals("size mismatch\n" +
61                 format.format(object) + "\n" +
62                 "expectedResults=" + expectedResults + "\n" +
63                 "        results=" + results, expectedResults.size(), results.size());
64    for (int i = 0; i < results.size(); ++i) {
65      if (!results.contains(expectedResults.get(i))) {
66        fail("didn't find expected result " + expectedResults.get(i) + "\n" +
67            "expectedResults=" + expectedResults + "\n" +
68            "        results=" + results);
69      }
70    }
71  }
72
73  /**
74   * finds attributes with regards to char index in this
75   * AttributedCharacterIterator, and puts them in a vector
76   *
77   * @param iterator
78   * @return a vector, each entry in this vector are of type FieldContainer,
79   *       which stores start and end indexes and an attribute this range has
80   */
81  protected static Vector<FieldContainer> findFields(AttributedCharacterIterator iterator) {
82    Vector<FieldContainer> result = new Vector<FieldContainer>();
83    while (iterator.getIndex() != iterator.getEndIndex()) {
84      int start = iterator.getRunStart();
85      int end = iterator.getRunLimit();
86
87      Iterator<Attribute> it = iterator.getAttributes().keySet().iterator();
88      while (it.hasNext()) {
89        AttributedCharacterIterator.Attribute attribute = it.next();
90        Object value = iterator.getAttribute(attribute);
91        result.add(new FieldContainer(start, end, attribute, value));
92        // System.out.println(start + " " + end + ": " + attribute + ",
93        // " + value );
94        // System.out.println("v.add(new FieldContainer(" + start +"," +
95        // end +"," + attribute+ "," + value+ "));");
96      }
97      iterator.setIndex(end);
98    }
99    return result;
100  }
101
102  static class FieldContainer {
103    final int start;
104    final int end;
105    final Attribute attribute;
106    final Object value;
107
108    // called from Support_DecimalFormat and Support_SimpleDateFormat tests
109    public FieldContainer(int start, int end, Attribute attribute) {
110      this(start, end, attribute, attribute);
111    }
112
113    // called from Support_MessageFormat tests
114    public FieldContainer(int start, int end, Attribute attribute, int value) {
115      this(start, end, attribute, new Integer(value));
116    }
117
118    // called from Support_MessageFormat tests
119    public FieldContainer(int start, int end, Attribute attribute, Object value) {
120      this.start = start;
121      this.end = end;
122      this.attribute = attribute;
123      this.value = value;
124    }
125
126    @Override public boolean equals(Object obj) {
127      if (!(obj instanceof FieldContainer)) {
128        return false;
129      }
130
131      FieldContainer fc = (FieldContainer) obj;
132      return (start == fc.start && end == fc.end && attribute == fc.attribute && value.equals(fc.value));
133    }
134
135    @Override public String toString() {
136      return "FC[" + start + ".." + end + ",attribute=" + attribute + ",value=" + value + "]";
137    }
138  }
139}
140