blob: f567f3f5100ffe1eb21295453679be97b0f28250 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 groovy
import groovy.io.GroovyPrintStream
import groovy.test.GroovyTestCase
import java.text.NumberFormat
class PrintTest extends GroovyTestCase {
PrintStream savedSystemOut
private locale
void setUp() {
savedSystemOut = System.out
locale = Locale.getDefault()
Locale.setDefault(Locale.US)
}
void tearDown() {
Locale.setDefault(locale)
System.setOut(savedSystemOut)
}
void testToString() {
assertToString("hello", 'hello')
assertToString([], "[]")
assertToString([1, 2, "hello"], '[1, 2, hello]')
assertToString([1: 20, 2: 40, 3: 'cheese'], '[1:20, 2:40, 3:cheese]')
assertToString([:], "[:]")
assertToString([['bob': 'drools', 'james': 'geronimo']], '[[bob:drools, james:geronimo]]')
assertToString([5, ["bob", "james"], ["bob": "drools", "james": "geronimo"], "cheese"], '[5, [bob, james], [bob:drools, james:geronimo], cheese]')
}
void testInspect() {
assertInspect("hello", "'hello'")
assertInspect([], "[]")
assertInspect([1, 2, "hello"], "[1, 2, 'hello']")
assertInspect([1: 20, 2: 40, 3: 'cheese'], "[1:20, 2:40, 3:'cheese']")
assertInspect([:], "[:]")
assertInspect([['bob': 'drools', 'james': 'geronimo']], "[['bob':'drools', 'james':'geronimo']]")
assertInspect([5, ["bob", "james"], ["bob": "drools", "james": "geronimo"], "cheese"], "[5, ['bob', 'james'], ['bob':'drools', 'james':'geronimo'], 'cheese']")
}
void testCPlusPlusStylePrinting() {
def endl = "\n"
System.out << "Hello world!" << endl
}
void testSprintf() {
def decimalSymbol = NumberFormat.instance.format(1.5) - '1' - '5'
assert sprintf('%5.2f', 12 * 3.5) == "42${decimalSymbol}00"
assert sprintf('%d + %d = %d', [1, 2, 1 + 2] as Integer[]) == '1 + 2 = 3'
assert sprintf('%d + %d = %d', [2, 3, 2 + 3] as int[]) == '2 + 3 = 5'
assert sprintf('%d + %d = %d', [3, 4, 3 + 4] as long[]) == '3 + 4 = 7'
assert sprintf('%d + %d = %d', [4, 5, 4 + 5] as byte[]) == '4 + 5 = 9'
assert sprintf('%d + %d = %d', [5, 6, 5 + 6] as short[]) == '5 + 6 = 11'
def floatExpr = sprintf('%5.2f + %5.2f = %5.2f', [3, 4, 3 + 4] as float[])
assertEquals " 3${decimalSymbol}00 + 4${decimalSymbol}00 = 7${decimalSymbol}00", floatExpr
def doubleExpr = sprintf('%5.2g + %5.2g = %5.2g', [3, 4, 3 + 4] as double[])
// TODO: work out why decimalSymbol is not used here (at least for FR and RU)
assertEquals " 3.0 + 4.0 = 7.0", doubleExpr
assert sprintf('hi %s', 'there') == 'hi there'
assert sprintf('%c', 0x41) == 'A'
assert sprintf('%x', 0x41) == '41'
assert sprintf('%o', 0x41) == '101'
assert sprintf('%h', 0x41) == '41'
assert sprintf('%b %b', [true, false] as boolean[]) == 'true false'
}
void testSprintfExceptionPropagation() {
shouldFail(IllegalArgumentException) {
sprintf('%2.4f', [3])
}
}
def NEWLINE = System.lineSeparator()
void doTest(def param) {
StringWriter sw1 = new StringWriter()
StringWriter sw2 = new StringWriter()
StringWriter sw3 = new StringWriter()
StringWriter sw4 = new StringWriter()
StringWriter sw5 = new StringWriter()
ByteArrayOutputStream baos1 = new ByteArrayOutputStream()
ByteArrayOutputStream baos2 = new ByteArrayOutputStream()
ByteArrayOutputStream baos3 = new ByteArrayOutputStream()
sw1.write(param as String)
sw2.print(param)
sw3.withPrintWriter { it.print param }
new PrintWriter(sw4).print(param)
sw5.newPrintWriter().print(param)
new PrintStream(baos1).print(param)
new GroovyPrintStream(baos2).print(param)
System.setOut(new PrintStream(baos3))
print(param)
def t1 = sw1.toString()
def t2 = sw2.toString()
def t3 = sw3.toString()
def t4 = sw4.toString()
def t5 = sw5.toString()
def t6 = baos1.toString()
def t7 = baos2.toString()
def t8 = baos3.toString()
assert t1 == t2
assert t1 == t3
assert t1 == t4
assert t1 == t5
assert t1 == t6
assert t1 == t7
assert t1 == t8
sw1.buffer.length = 0
sw2.buffer.length = 0
sw3.buffer.length = 0
sw4.buffer.length = 0
sw5.buffer.length = 0
baos1.reset()
baos2.reset()
baos3.reset()
sw1.write(param as String)
sw1.write(NEWLINE)
sw2.println(param)
sw3.withPrintWriter { it.println param }
new PrintWriter(sw4).println(param)
sw5.newPrintWriter().println(param)
new PrintStream(baos1).println(param)
new GroovyPrintStream(baos2).println(param)
System.setOut(new PrintStream(baos3))
println(param)
t1 = sw1.toString()
t2 = sw2.toString()
t3 = sw3.toString()
t4 = sw4.toString()
t5 = sw5.toString()
t6 = baos1.toString()
t7 = baos2.toString()
t8 = baos3.toString()
assert t1 == t2
assert t1 == t3
assert t1 == t4
assert t1 == t5
assert t1 == t6
assert t1 == t7
assert t1 == t8
}
void testGroovy3227() {
doTest(null)
doTest("foo")
doTest(true)
doTest(false)
doTest((byte)123)
doTest((short)1234)
doTest(new Integer(1234))
doTest(new Long(9999999999))
doTest(new Float(1234.5678))
doTest(new Double(1234.5678))
doTest(new BigInteger("123456789012345678901234567890"))
doTest(new BigDecimal("12345678901234567890.1234567890123456789"))
doTest(new Date(107, 12, 31))
doTest(new StringBuffer("bar"))
doTest([null, "foo", true, false, new Integer(1234)])
doTest(["foo" : "bar", "true": true, "int": new Integer(1234)])
doTest([null, "foo", true, false, new Integer(1234)] as Object[])
doTest(["foo",new Integer(1234)] as String[])
doTest([true, false] as Boolean[])
doTest([true, false] as boolean[])
doTest([1, 2, 3] as int[])
doTest([1, 2, 3] as Integer[])
doTest(['a', 'b', 'c'] as char[])
doTest(['a', 'b', 'c'] as Character[])
}
}