blob: e69fb8e32c9a5567730798f7fdae55786ef5c343 [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 org.apache.jackrabbit.vault.util;
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.Value;
import javax.jcr.nodetype.PropertyDefinition;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
/**
* {@code DocViewPropertyTest}...
*/
public class DocViewPropertyTest {
@Test
public void testParseUndefined() {
DocViewProperty p = DocViewProperty.parse("foo", "hello");
Assert.assertEquals(new DocViewProperty("foo", new String[] {"hello"}, false, PropertyType.UNDEFINED), p);
}
@Test
public void testParseLong() {
DocViewProperty p = DocViewProperty.parse("foo", "{Long}1234");
Assert.assertEquals(new DocViewProperty("foo", new String[] {"1234"}, false, PropertyType.LONG), p);
}
@Test
public void testEquals() {
DocViewProperty p1 = DocViewProperty.parse("foo", "{Long}1234");
DocViewProperty p2 = DocViewProperty.parse("foo", "{Long}1234");
Assert.assertEquals(p1, p2);
DocViewProperty p3 = DocViewProperty.parse("foo", "{String}1234");
Assert.assertNotEquals(p1, p3);
}
@Test
public void testParseEmpty() {
DocViewProperty p = DocViewProperty.parse("foo", "{Binary}");
Assert.assertEquals(new DocViewProperty("foo", new String[] { ""}, false, PropertyType.BINARY), p);
}
@Test
public void testParseSpecial() {
DocViewProperty p = DocViewProperty.parse("foo", "\\{hello, world}");
assertEquals(p, false, PropertyType.UNDEFINED, "{hello, world}");
p = DocViewProperty.parse("foo", "{String}\\[hello");
assertEquals(p, false, PropertyType.STRING, "[hello");
}
@Test
public void testParseStringTyped() {
DocViewProperty p = DocViewProperty.parse("foo", "{String}hello");
assertEquals(p, false, PropertyType.STRING, "hello");
}
@Test
public void testParseStringUnicode() {
DocViewProperty p = DocViewProperty.parse("foo", "{String}he\\u000fllo");
assertEquals(p, false, PropertyType.STRING, "he\u000fllo");
}
@Test
public void testParseMVString() {
DocViewProperty p = DocViewProperty.parse("foo", "[hello,world]");
assertEquals(p, true, PropertyType.UNDEFINED, "hello", "world");
p = DocViewProperty.parse("foo", "[hello\\,world]");
assertEquals(p, true, PropertyType.UNDEFINED, "hello,world");
}
@Test
public void testParseEmptyMVStrings() {
DocViewProperty p = DocViewProperty.parse("foo", "[,a,b,c]");
assertEquals(p, true, PropertyType.UNDEFINED, "", "a", "b", "c");
p = DocViewProperty.parse("foo", "[a,b,c,]");
assertEquals(p, true, PropertyType.UNDEFINED, "a", "b", "c", "");
p = DocViewProperty.parse("foo", "[,,,]");
assertEquals(p, true, PropertyType.UNDEFINED, "", "", "", "");
}
@Test
public void testParseMVSpecial() {
DocViewProperty p = DocViewProperty.parse("foo", "[\\[hello,world]");
assertEquals(p, true, PropertyType.UNDEFINED, "[hello", "world");
p = DocViewProperty.parse("foo", "[[hello],[world]]");
assertEquals(p, true, PropertyType.UNDEFINED, "[hello]", "[world]");
p = DocViewProperty.parse("foo", "[he\\[llo,world]");
assertEquals(p, true, PropertyType.UNDEFINED, "he[llo", "world");
p = DocViewProperty.parse("foo", "[hello\\[,world]");
assertEquals(p, true, PropertyType.UNDEFINED, "hello[", "world");
p = DocViewProperty.parse("foo", "[hello,\\[world]");
assertEquals(p, true, PropertyType.UNDEFINED, "hello", "[world");
p = DocViewProperty.parse("foo", "[hello,world\\[]");
assertEquals(p, true, PropertyType.UNDEFINED, "hello", "world[");
p = DocViewProperty.parse("foo", "[hello,world");
assertEquals(p, true, PropertyType.UNDEFINED, "hello", "world");
p = DocViewProperty.parse("foo", "[bla{a\\,b},foo{a\\,b},bar{a\\,b}]");
assertEquals(p, true, PropertyType.UNDEFINED, "bla{a,b}", "foo{a,b}", "bar{a,b}");
p = DocViewProperty.parse("foo", "[/content/[a-z]{2\\,3}/[a-z]{2\\,3}(/.*)]");
assertEquals(p, true, PropertyType.UNDEFINED, "/content/[a-z]{2,3}/[a-z]{2,3}(/.*)");
}
@Test
public void testParseMVLong() {
DocViewProperty p = DocViewProperty.parse("foo", "{Long}[1,2]");
assertEquals(p, true, PropertyType.LONG, "1", "2");
}
@Test
public void testParseMVLongEmpty() {
DocViewProperty p = DocViewProperty.parse("foo", "{Long}[]");
assertEquals(p, true, PropertyType.LONG);
}
@Test
public void testParseMVStringEmpty() {
DocViewProperty p = DocViewProperty.parse("foo", "[]");
assertEquals(p, true, PropertyType.UNDEFINED);
}
/**
* Special test for mv properties with 1 empty string value (JCR-3661)
* @throws Exception
*/
@Test
public void testEmptyMVString() throws Exception {
Property p = Mockito.mock(Property.class);
Value value = Mockito.mock(Value.class);
Mockito.when(value.getString()).thenReturn("");
Value[] values = new Value[]{value};
PropertyDefinition pd = Mockito.mock(PropertyDefinition.class);
Mockito.when(pd.isMultiple()).thenReturn(true);
Mockito.when(p.getType()).thenReturn(PropertyType.STRING);
Mockito.when(p.getName()).thenReturn("foo");
Mockito.when(p.getValues()).thenReturn(values);
Mockito.when(p.getDefinition()).thenReturn(pd);
String result = DocViewProperty.format(p);
Assert.assertEquals("formatted property", "[\\0]", result);
// now round trip back
DocViewProperty dp = DocViewProperty.parse("foo", result);
Assert.assertEquals(new DocViewProperty("foo", new String[] {""}, true, PropertyType.UNDEFINED), dp);
}
@Test
public void testEmptyMVBoolean() throws Exception {
Property p = Mockito.mock(Property.class);
Value value = Mockito.mock(Value.class);
Mockito.when(value.getString()).thenReturn("false");
Value[] values = new Value[]{value};
PropertyDefinition pd = Mockito.mock(PropertyDefinition.class);
Mockito.when(pd.isMultiple()).thenReturn(true);
Mockito.when(p.getType()).thenReturn(PropertyType.BOOLEAN);
Mockito.when(p.getName()).thenReturn("foo");
Mockito.when(p.getValues()).thenReturn(values);
Mockito.when(p.getDefinition()).thenReturn(pd);
String result = DocViewProperty.format(p);
Assert.assertEquals("formatted property", "{Boolean}[false]", result);
// now round trip back
DocViewProperty dp = DocViewProperty.parse("foo", result);
Assert.assertEquals(new DocViewProperty("foo", new String[] {"false"}, true, PropertyType.BOOLEAN), dp);
}
@Test
public void testEscape() {
assertEscaped("hello", "hello", false);
assertEscaped("hello, world", "hello, world", false);
assertEscaped("hello, world", "hello\\, world", true);
assertEscaped("[hello]", "\\[hello]", false);
assertEscaped("[hello]", "[hello]", true);
assertEscaped("{hello}", "\\{hello}", false);
assertEscaped("{hello}", "{hello}", true);
assertEscaped("hello\u000fworld", "hello\\u000fworld", false);
assertEscaped("hello\u000fworld", "hello\\u000fworld", true);
assertEscaped("hello\\world", "hello\\\\world", false);
assertEscaped("hello\\world", "hello\\\\world", true);
}
private void assertEscaped(String original, String expected, boolean multi) {
StringBuffer buf = new StringBuffer();
DocViewProperty.escape(buf, original, multi);
Assert.assertEquals(expected, buf.toString());
}
private void assertEquals(DocViewProperty p, boolean multi, int type, String... values) {
Assert.assertEquals(new DocViewProperty(p.name, values, multi, type), p);
}
}