/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * 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.alibaba.citrus.util; import static com.alibaba.citrus.util.CollectionUtil.*; import static org.junit.Assert.*; import java.util.List; import java.util.Map; import com.alibaba.citrus.util.ToStringBuilder.CollectionBuilder; import com.alibaba.citrus.util.ToStringBuilder.MapBuilder; import org.junit.Before; import org.junit.Test; /** * 测试<code>ToStringBuilder</code>。 * * @author Michael Zhou */ public class ToStringBuilderTests { private ToStringBuilder buf; private String result; @Before public void init() { buf = new ToStringBuilder(); result = ""; } @Test public void primitives() { buf.append(true).append("\n"); buf.append((byte) 123).append("\n"); buf.append('c').append("\n"); buf.append(123.456D).append("\n"); buf.append(123.456F).append("\n"); buf.append(123).append("\n"); buf.append(123456L).append("\n"); buf.append((short) 123).append("\n"); result += "true\n"; result += "123\n"; result += "c\n"; result += "123.456\n"; result += "123.456\n"; result += "123\n"; result += "123456\n"; result += "123\n"; assertEquals(result, buf.toString()); } @Test public void primitiveArrays_multilines_desc() { Object[] values = getPrimitiveArrayData(18); buf.setPrintDescription(true).append(values); result += "java.lang.Object[9] [\n"; result += " [1/9] boolean[18] [\n"; result += " [01-10/18] true false true false true false true false true false\n"; result += " [11-18/18] true false true false true false true false\n"; result += " ]\n"; result += " [2/9] byte[18] [\n"; result += " [01-10/18] 00 01 02 03 04 05 06 07 08 09\n"; result += " [11-18/18] 0a 0b 0c 0d 0e 0f 10 11\n"; result += " ]\n"; result += " [3/9] char[18] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] : ; < = > ? @ A\n"; result += " ]\n"; result += " [4/9] double[18] [\n"; result += " [01-10/18] 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0\n"; result += " [11-18/18] 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0\n"; result += " ]\n"; result += " [5/9] float[18] [\n"; result += " [01-10/18] 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0\n"; result += " [11-18/18] 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0\n"; result += " ]\n"; result += " [6/9] int[18] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] 10 11 12 13 14 15 16 17\n"; result += " ]\n"; result += " [7/9] long[18] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] 10 11 12 13 14 15 16 17\n"; result += " ]\n"; result += " [8/9] short[18] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] 10 11 12 13 14 15 16 17\n"; result += " ]\n"; result += " [9/9] aaa\n"; result += " bbb\n"; result += " ccc\n"; result += "]"; assertEquals(result, buf.toString()); } @Test public void primitiveArrays_multilines_no_desc() { Object[] values = getPrimitiveArrayData(18); buf.append(values); result += "[\n"; result += " [1/9] [\n"; result += " [01-10/18] true false true false true false true false true false\n"; result += " [11-18/18] true false true false true false true false\n"; result += " ]\n"; result += " [2/9] [\n"; result += " [01-10/18] 00 01 02 03 04 05 06 07 08 09\n"; result += " [11-18/18] 0a 0b 0c 0d 0e 0f 10 11\n"; result += " ]\n"; result += " [3/9] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] : ; < = > ? @ A\n"; result += " ]\n"; result += " [4/9] [\n"; result += " [01-10/18] 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0\n"; result += " [11-18/18] 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0\n"; result += " ]\n"; result += " [5/9] [\n"; result += " [01-10/18] 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0\n"; result += " [11-18/18] 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0\n"; result += " ]\n"; result += " [6/9] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] 10 11 12 13 14 15 16 17\n"; result += " ]\n"; result += " [7/9] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] 10 11 12 13 14 15 16 17\n"; result += " ]\n"; result += " [8/9] [\n"; result += " [01-10/18] 0 1 2 3 4 5 6 7 8 9\n"; result += " [11-18/18] 10 11 12 13 14 15 16 17\n"; result += " ]\n"; result += " [9/9] aaa\n"; result += " bbb\n"; result += " ccc\n"; result += "]"; assertEquals(result, buf.toString()); } @Test public void primitiveArrays_oneline_desc() { Object[] values = getPrimitiveArrayData(8); buf.setPrintDescription(true).append(values); result += "java.lang.Object[9] [\n"; result += " [1/9] boolean[8] [true, false, true, false, true, false, true, false]\n"; result += " [2/9] byte[8] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [3/9] char[8] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [4/9] double[8] [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]\n"; result += " [5/9] float[8] [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]\n"; result += " [6/9] int[8] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [7/9] long[8] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [8/9] short[8] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [9/9] aaa\n"; result += " bbb\n"; result += " ccc\n"; result += "]"; assertEquals(result, buf.toString()); } @Test public void primitiveArrays_oneline_no_desc() { Object[] values = getPrimitiveArrayData(8); buf.append(values); result += "[\n"; result += " [1/9] [true, false, true, false, true, false, true, false]\n"; result += " [2/9] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [3/9] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [4/9] [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]\n"; result += " [5/9] [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]\n"; result += " [6/9] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [7/9] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [8/9] [0, 1, 2, 3, 4, 5, 6, 7]\n"; result += " [9/9] aaa\n"; result += " bbb\n"; result += " ccc\n"; result += "]"; assertEquals(result, buf.toString()); } @Test public void primitiveArrays_subset() { byte[] values = (byte[]) getPrimitiveArrayData(30)[1]; buf.setPrintDescription(true).appendArray(values, 2, 20); result += "byte[30] [\n"; result += " [03-12/30] 02 03 04 05 06 07 08 09 0a 0b\n"; result += " [13-22/30] 0c 0d 0e 0f 10 11 12 13 14 15\n"; result += "]"; assertEquals(result, buf.toString()); } @Test public void primitiveArrays_subset_lengthOutOfRange() { byte[] values = (byte[]) getPrimitiveArrayData(30)[1]; buf.setPrintDescription(true).appendArray(values, 2, 40); result += "byte[30] [\n"; result += " [03-12/30] 02 03 04 05 06 07 08 09 0a 0b\n"; result += " [13-22/30] 0c 0d 0e 0f 10 11 12 13 14 15\n"; result += " [23-30/30] 16 17 18 19 1a 1b 1c 1d\n"; result += "]"; assertEquals(result, buf.toString()); } @Test public void primitiveArrays_subset_offsetOutOfRange() { byte[] values = (byte[]) getPrimitiveArrayData(30)[1]; buf.setPrintDescription(true).appendArray(values, 40, 40); result += "byte[30] []"; assertEquals(result, buf.toString()); } private Object[] getPrimitiveArrayData(int length) { boolean[] a1 = new boolean[length]; byte[] a2 = new byte[length]; char[] a3 = new char[length]; double[] a4 = new double[length]; float[] a5 = new float[length]; int[] a6 = new int[length]; long[] a7 = new long[length]; short[] a8 = new short[length]; for (int i = 0; i < length; i++) { a1[i] = i % 2 == 0; a2[i] = (byte) i; a3[i] = (char) ('0' + i); a4[i] = i; a5[i] = i; a6[i] = i; a7[i] = i; a8[i] = (short) i; } Object[] values = new Object[] { a1, a2, a3, a4, a5, a6, a7, a8, "aaa\nbbb\nccc" }; return values; } @Test public void objects() { buf.append("aaa\rbbb\r\nccc"); assertEquals("aaa\nbbb\nccc", buf.toString()); buf.append("ddd\n\reee\n"); assertEquals("aaa\nbbb\ncccddd\n\neee\n", buf.toString()); } @Test public void _null() { buf.append(null); assertEquals("<null>", buf.toString()); } @Test public void appendNull() { buf.appendNull(); assertEquals("<null>", buf.toString()); } @Test public void objectsWithHangingIndent() { buf.appendHangingIndent("aaa\nbbb\nccc"); result += "aaa\n"; result += " bbb\n"; result += " ccc"; assertEquals(result, buf.toString()); buf.appendHangingIndent("ddd\neee\n"); result += "\n"; result += "ddd\n"; result += " eee\n"; assertEquals(result, buf.toString()); } @Test public void objectsWithHangingIndent2() { buf.appendHangingIndent("\n"); assertEquals("\n", buf.toString()); } @Test public void map() { MapBuilder mb = new MapBuilder().setSortKeys(true).setPrintCount(true); mb.append("dddd", "111\n222\n333"); mb.append("ccc", "444\n555\n"); mb.append("a", "666"); buf.append("map "); buf.append(mb); result += "{\n"; result += " [1/3] a = 666\n"; result += " [2/3] ccc = 444\n"; result += " 555\n"; result += " [3/3] dddd = 111\n"; result += " 222\n"; result += " 333\n"; result += "}"; assertEquals("map " + result, buf.toString()); assertEquals(result, mb.toString()); } @Test public void map_clear() { MapBuilder mb = new MapBuilder().setSortKeys(true).setPrintCount(true); mb.append("dddd", "111\n222\n333"); mb.append("ccc", "444\n555\n"); mb.append("a", "666"); buf.append("map "); buf.append(mb); result += "{\n"; result += " [1/3] a = 666\n"; result += " [2/3] ccc = 444\n"; result += " 555\n"; result += " [3/3] dddd = 111\n"; result += " 222\n"; result += " 333\n"; result += "}"; assertEquals("map " + result, buf.toString()); assertEquals(result, mb.toString()); mb.clear(); buf.clear(); assertEquals("{}", mb.toString()); assertEquals("", buf.toString()); } @Test public void map_noCount() { MapBuilder mb = new MapBuilder().setSortKeys(true).setPrintCount(false); mb.append("dddd", "111\n222\n333"); mb.append("ccc", "444\n555\n"); mb.append("a", "666"); buf.append(mb); result += "{\n"; result += " a = 666\n"; result += " ccc = 444\n"; result += " 555\n"; result += " dddd = 111\n"; result += " 222\n"; result += " 333\n"; result += "}"; assertEquals(result, mb.toString()); } @Test public void appendMap() { Map<String, String> map = createHashMap(); map.put("dddd", "111\n222\n333"); map.put("ccc", "444\n555\n"); map.put("a", "666"); buf.appendMap(map, true); result += "{\n"; result += " [1/3] a = 666\n"; result += " [2/3] ccc = 444\n"; result += " 555\n"; result += " [3/3] dddd = 111\n"; result += " 222\n"; result += " 333\n"; result += "}"; assertEquals(result, buf.toString()); } @Test public void list() { CollectionBuilder cb = new CollectionBuilder().setPrintCount(true); cb.append("111\n222\n333"); cb.append("444\n555\n"); cb.append("666"); buf.append("list "); buf.append(cb); result += "[\n"; result += " [1/3] 111\n"; result += " 222\n"; result += " 333\n"; result += " [2/3] 444\n"; result += " 555\n"; result += " [3/3] 666\n"; result += "]"; assertEquals("list " + result, buf.toString()); assertEquals(result, cb.toString()); } @Test public void list_sort() { CollectionBuilder cb = new CollectionBuilder().setSort(true); cb.append("666"); cb.append("444\n555\n"); cb.append("111\n222\n333"); buf.append("list "); buf.append(cb); result += "[\n"; result += " 111\n"; result += " 222\n"; result += " 333\n"; result += " 444\n"; result += " 555\n"; result += " 666\n"; result += "]"; assertEquals(result, cb.toString()); assertEquals("list " + result, buf.toString()); } @Test public void list_clear() { CollectionBuilder cb = new CollectionBuilder().setPrintCount(true); cb.append("111\n222\n333"); cb.append("444\n555\n"); cb.append("666"); buf.append("list "); buf.append(cb); result += "[\n"; result += " [1/3] 111\n"; result += " 222\n"; result += " 333\n"; result += " [2/3] 444\n"; result += " 555\n"; result += " [3/3] 666\n"; result += "]"; assertEquals("list " + result, buf.toString()); assertEquals(result, cb.toString()); cb.clear(); buf.clear(); assertEquals("[]", cb.toString()); assertEquals("", buf.toString()); } @Test public void list_oneline() { CollectionBuilder cb = new CollectionBuilder().setOneLine(true); cb.append("111"); cb.append("444"); cb.append("666"); buf.append(cb); result += "[111, 444, 666]"; assertEquals(result, cb.toString()); } @Test public void list_noCount() { CollectionBuilder cb = new CollectionBuilder(); cb.append("111\n222\n333"); cb.append("444\n555\n"); cb.append("666"); buf.append("list "); buf.append(cb); result += "[\n"; result += " 111\n"; result += " 222\n"; result += " 333\n"; result += " 444\n"; result += " 555\n"; result += " 666\n"; result += "]"; assertEquals(result, cb.toString()); assertEquals("list " + result, buf.toString()); } @Test public void appendList() { List<String> list = createArrayList(); list.add("111\n222\n333"); list.add("444\n555\n"); list.add("666"); buf.appendCollection(list); result += "[\n"; result += " [1/3] 111\n"; result += " 222\n"; result += " 333\n"; result += " [2/3] 444\n"; result += " 555\n"; result += " [3/3] 666\n"; result += "]"; assertEquals(result, buf.toString()); } @Test public void appendDescription() { buf.appendDescription(new Object()); assertTrue(buf.toString().startsWith("java.lang.Object@")); } }