/**
* 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 org.apache.hadoop.hive.ql.udf.generic;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.UDFChr;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.junit.Assert;
import org.junit.Test;
public class TestGenericUDFChr {
@Test
public void testChr() throws HiveException {
UDFChr udf = new UDFChr();
// Test string "0"
double d = 48.0d;
float f = 48.0f;
long l = 48L;
int i = 48;
short s = 48;
runAndVerify(d, udf, "0");
runAndVerify(f, udf, "0");
runAndVerify(l, udf, "0");
runAndVerify(i, udf, "0");
runAndVerify(s, udf, "0");
// Test string "A"
d = 65.123d;
f = 65.123f;
l = 65L;
i = 65;
s = 65;
runAndVerify(d, udf, "A");
runAndVerify(f, udf, "A");
runAndVerify(l, udf, "A");
runAndVerify(i, udf, "A");
runAndVerify(s, udf, "A");
// Test negative integers result in ""
d = -65.123d;
f = -65.123f;
l = -65L;
i = -65;
s = -65;
runAndVerify(d, udf, "");
runAndVerify(f, udf, "");
runAndVerify(l, udf, "");
runAndVerify(i, udf, "");
runAndVerify(s, udf, "");
// Test 0 is nul character
d = 0.9d;
f = 0.9f;
l = 0L;
i = 0;
s = 0;
char nul = '\u0000';
String nulString = String.valueOf(nul);
runAndVerify(d, udf, nulString);
runAndVerify(f, udf, nulString);
runAndVerify(l, udf, nulString);
runAndVerify(i, udf, nulString);
runAndVerify(s, udf, nulString);
// Test 256 or greater is n % 256
d = 256.9d;
f = 256.9f;
l = 256L;
i = 256;
s = 256;
runAndVerify(d, udf, nulString);
runAndVerify(f, udf, nulString);
runAndVerify(l, udf, nulString);
runAndVerify(i, udf, nulString);
runAndVerify(s, udf, nulString);
d = 321.9d;
f = 321.9f;
l = 321L;
i = 321;
s = 321;
runAndVerify(d, udf, "A");
runAndVerify(f, udf, "A");
runAndVerify(l, udf, "A");
runAndVerify(i, udf, "A");
runAndVerify(s, udf, "A");
// Test down-casting when greater than 256.
d = Double.MAX_VALUE;
f = Float.MAX_VALUE;
l = Long.MAX_VALUE;
i = Integer.MAX_VALUE;
s = Short.MAX_VALUE; // 32767 % 256 = 255
runAndVerify(d, udf, "");
runAndVerify(f, udf, "");
runAndVerify(l, udf, "");
runAndVerify(i, udf, "");
runAndVerify(s, udf, "ΓΏ");
}
private void runAndVerify(long v, UDFChr udf, String expV) throws HiveException {
Text output = (Text) udf.evaluate(new LongWritable(v));
verifyOutput(output, expV);
}
private void runAndVerify(int v, UDFChr udf, String expV) throws HiveException {
Text output = (Text) udf.evaluate(new LongWritable(v));
verifyOutput(output, expV);
}
private void runAndVerify(short v, UDFChr udf, String expV) throws HiveException {
Text output = (Text) udf.evaluate(new LongWritable(v));
verifyOutput(output, expV);
}
private void runAndVerify(double v, UDFChr udf, String expV) throws HiveException {
Text output = (Text) udf.evaluate(new DoubleWritable(v));
verifyOutput(output, expV);
}
private void runAndVerify(float v, UDFChr udf, String expV) throws HiveException {
Text output = (Text) udf.evaluate(new DoubleWritable(v));
verifyOutput(output, expV);
}
private void verifyOutput(Text output, String expV) {
if (expV == null) {
Assert.assertNull(output);
} else {
Assert.assertNotNull(output);
Assert.assertEquals("chr() test ", expV, output.toString());
}
}
}