blob: 86403e582341786172bcd491d0f18533d7846dc4 [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.felix.serializer.impl.yaml;
import java.util.HashMap;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.util.converter.Converter;
import org.osgi.util.converter.Converters;
import org.osgi.util.converter.TypeReference;
import org.osgi.util.converter.TypeRule;
import static org.junit.Assert.assertEquals;
public class YamlSerializerTest {
private Converter converter;
@Before
public void setUp() {
converter = Converters.standardConverter();
}
@After
public void tearDown() {
converter = null;
}
@Test
public void testYAMLCodec() throws Exception {
Map<Object, Object> m1 = new HashMap<>();
m1.put("x", true);
m1.put("y", null);
Map<Object, Object> m = new HashMap<>();
m.put(1, 11L);
m.put("ab", "cd");
m.put(true, m1);
YamlSerializerImpl yamlCodec = new YamlSerializerImpl();
String yaml = yamlCodec.serialize(m).toString();
assertEquals("1: 11\n" +
"ab: 'cd'\n" +
"true: \n" +
" x: true\n" +
" y:", yaml);
@SuppressWarnings("rawtypes")
Map m2 = yamlCodec.deserialize(Map.class).from(yaml);
// m2 is not exactly equal to m, as the keys are all strings now, this is unavoidable with YAML
assertEquals(m.size(), m2.size());
assertEquals(converter.convert(m.get(1)).to(int.class),
converter.convert(m2.get(1)).to(int.class));
assertEquals(m.get("ab"), m2.get("ab"));
assertEquals(m.get(true), m2.get(true));
}
@Test
public void testCodecWithAdapter() {
Map<String, Foo> m1 = new HashMap<>();
m1.put("f", new Foo("fofofo"));
Map<String, Map<String,Foo>> m = new HashMap<>();
m.put("submap", m1);
Converter ca = converter.newConverterBuilder().
rule(new TypeRule<Foo, String>(Foo.class, String.class, Foo::tsFun)).
rule(new TypeRule<String, Foo>(String.class, Foo.class, v -> Foo.fsFun(v))).build();
YamlSerializerImpl yamlCodec = new YamlSerializerImpl();
String yaml = yamlCodec.serialize(m).convertWith(ca).toString();
assertEquals("submap: \n" +
" f: '<fofofo>'", yaml);
// And convert back
Map<String,Map<String,Foo>> m2 = yamlCodec.deserialize(new TypeReference<Map<String,Map<String,Foo>>>(){}).
convertWith(ca).from(yaml);
assertEquals(m, m2);
}
static class Foo {
private final String val;
public Foo(String s) {
val = s;
}
public String tsFun() {
return "<" + val + ">";
}
public static Foo fsFun(String s) {
return new Foo(s.substring(1, s.length() - 1));
}
@Override
public int hashCode() {
return val.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (!(obj instanceof Foo))
return false;
Foo f = (Foo) obj;
return f.val.equals(val);
}
}
}