/**
 * Copyright (c) 2008-2010 Andrey Somov
 *
 * 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 org.yaml.snakeyaml.ruby;

import junit.framework.TestCase;

import org.yaml.snakeyaml.Dumper;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.JavaBeanLoader;
import org.yaml.snakeyaml.Loader;
import org.yaml.snakeyaml.TypeDescription;
import org.yaml.snakeyaml.Util;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Representer;

public class RubyTest extends TestCase {

    public void testParse() {
        TestObject result = parseObject(Util.getLocalResource("ruby/ruby1.yaml"));
        assertNotNull(result);
        assertEquals(0, result.getSub1().getAtt2());
        assertEquals("MyString", result.getSub2().getAtt1());
        assertEquals(1, result.getSub2().getAtt2().size());
        assertEquals(12345, result.getSub2().getAtt3());
    }

    public void testEmitNoTags() {
        TestObject result = parseObject(Util.getLocalResource("ruby/ruby1.yaml"));
        DumperOptions options = new DumperOptions();
        options.setExplicitStart(true);
        options.setExplicitRoot(Tag.MAP);
        Yaml yaml2 = new Yaml(options);
        String output = yaml2.dump(result);
        assertFalse("No tags expected.", output.contains("Sub1"));
        // System.out.println(output);
        // parse back. Without tags it shall still work
        JavaBeanLoader<TestObject> beanLoader = new JavaBeanLoader<TestObject>(TestObject.class);
        TestObject result2 = beanLoader.load(output);
        assertEquals(0, result2.getSub1().getAtt2());
        assertEquals("MyString", result2.getSub2().getAtt1());
        assertEquals(1, result2.getSub2().getAtt2().size());
        assertEquals(12345, result2.getSub2().getAtt3());
    }

    public void testEmitWithTags() {
        TestObject result = parseObject(Util.getLocalResource("ruby/ruby1.yaml"));
        DumperOptions options = new DumperOptions();
        options.setExplicitStart(true);
        Representer repr = new Representer();
        repr.addClassTag(TestObject.class, new Tag("!ruby/object:Test::Module::Object"));
        repr.addClassTag(Sub1.class, new Tag("!ruby/object:Test::Module::Sub1"));
        repr.addClassTag(Sub2.class, new Tag("!ruby/object:Test::Module::Sub2"));
        Yaml yaml2 = new Yaml(new Dumper(repr, options));
        String output = yaml2.dump(result);
        // System.out.println(output);
        assertTrue("Tags must be present.", output
                .startsWith("--- !ruby/object:Test::Module::Object"));
        assertTrue("Tags must be present: " + output, output
                .contains("!ruby/object:Test::Module::Sub1"));
        assertTrue("Tags must be present.", output.contains("!ruby/object:Test::Module::Sub2"));
        // parse back.
        TestObject result2 = parseObject(output);
        assertEquals(0, result2.getSub1().getAtt2());
        assertEquals("MyString", result2.getSub2().getAtt1());
        assertEquals(1, result2.getSub2().getAtt2().size());
        assertEquals(12345, result2.getSub2().getAtt3());
    }

    private TestObject parseObject(String input) {
        Constructor con = new Constructor(TestObject.class);
        con.addTypeDescription(new TypeDescription(TestObject.class,
                "!ruby/object:Test::Module::Object"));
        con.addTypeDescription(new TypeDescription(Sub1.class, "!ruby/object:Test::Module::Sub1"));
        con.addTypeDescription(new TypeDescription(Sub2.class, "!ruby/object:Test::Module::Sub2"));

        Yaml yaml = new Yaml(new Loader(con));
        return (TestObject) yaml.load(input);
    }
}
