/**
 * Copyright (c) 2008-2011, http://www.snakeyaml.org
 *
 * 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.representer;

import junit.framework.TestCase;

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.nodes.Tag;

public class RepresenterTest extends TestCase {

    public void testRepresenter() {
        MyBean bean = new MyBean();
        bean.setName("Gnome");
        bean.setValid(true);
        bean.setPrimitive(true);
        Yaml yaml = new Yaml();
        assertEquals(
                "!!org.yaml.snakeyaml.representer.RepresenterTest$MyBean {name: Gnome, primitive: true}\n",
                yaml.dump(bean));
    }

    public static class MyBean {
        private String name;
        private Boolean valid;
        private boolean primitive;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Boolean isValid() {
            return valid;
        }

        public void setValid(Boolean valid) {
            this.valid = valid;
        }

        public boolean isPrimitive() {
            return primitive;
        }

        public void setPrimitive(boolean primitive) {
            this.primitive = primitive;
        }
    }

    public void testRepresenterNoConstructorAvailable() {
        MyBean2 bean = new MyBean2("Gnome", true);
        DumperOptions options = new DumperOptions();
        options.setAllowReadOnlyProperties(true);
        Yaml yaml = new Yaml(options);
        assertEquals("!!org.yaml.snakeyaml.representer.RepresenterTest$MyBean2 {valid: true}\n",
                yaml.dump(bean));
    }

    public static class MyBean2 {
        private String name;
        private Boolean valid;

        public MyBean2(String name, Boolean valid) {
            this();
            this.name = name;
            this.valid = valid;
        }

        private MyBean2() {
            super();
        }

        private String getName() {
            return name;
        }

        public Boolean getValid() {
            return valid;
        }

        @Override
        public String toString() {
            return getName() + " " + getValid();
        }
    }

    public void testRepresenterGetterWithException() {
        MyBean3 bean = new MyBean3("Gnome", false);
        DumperOptions options = new DumperOptions();
        options.setAllowReadOnlyProperties(true);
        Yaml yaml = new Yaml(options);
        try {
            String str = yaml.dump(bean);
            fail("Exception must be reported: " + str);
        } catch (Exception e) {
            assertTrue(true);
        }
        // no exception
        MyBean3 bean2 = new MyBean3("Gnome", true);
        String str = yaml.dump(bean2);
        // FIXME isValid property is lost
        assertEquals("!!org.yaml.snakeyaml.representer.RepresenterTest$MyBean3 {name: Gnome}\n",
                str);
    }

    public static class MyBean3 {
        private String name;
        private Boolean valid;

        public MyBean3(String name, Boolean valid) {
            this.name = name;
            this.valid = valid;
        }

        public String getName() {
            if (valid) {
                return name;
            } else {
                throw new UnsupportedOperationException("Test.");
            }
        }

        public Boolean isValid() {
            return valid;
        }

        @Override
        public String toString() {
            return "MyBean3<" + name + ", " + isValid() + ">";
        }
    }

    public void testRepresenterAddNull() {
        Representer representer = new Representer();
        try {
            representer.addClassTag(EmptyBean.class, (Tag) null);
            fail("Tag must be provided.");
        } catch (Exception e) {
            assertEquals("Tag must be provided.", e.getMessage());
        }
    }

    public void testRepresenterEmptyBean() {
        EmptyBean bean = new EmptyBean();
        Yaml yaml = new Yaml();
        try {
            yaml.dump(bean);
            fail("EmptyBean has empty representation.");
        } catch (Exception e) {
            assertEquals(
                    "No JavaBean properties found in org.yaml.snakeyaml.representer.RepresenterTest$EmptyBean",
                    e.getMessage());
        }
    }

    public static class EmptyBean {
        private int number;

        public void process() {
            number += 1;
        }

        public int obtain() {
            return number;
        }
    }
}

@@ -3484,14 +3484,8 @@
   //
- FIXME
  isV
@@ -3493,47 +3493,159 @@
 lid 
-property is lost%0D%0A        assertEquals(
+is no JavaBean property (it must be a primitive then)%0D%0A        assertEquals(%0D%0A                %22isValid property must not be dumped.%22,%0D%0A                
 %22!!o
@@ -3699,16 +3699,36 @@
 yBean3 %7B
+boolProperty: true, 
 name: Gn
@@ -3857,32 +3857,71 @@
  Boolean valid;%0D
+%0A        private boolean boolProperty;%0D
 %0A%0D%0A        publi
@@ -4017,32 +4017,66 @@
 valid = valid;%0D%0A
+            boolProperty = true;%0D%0A
         %7D%0D%0A%0D%0A   
@@ -4308,32 +4308,32 @@
 an isValid() %7B%0D%0A
-
             retu
@@ -4348,32 +4348,122 @@
 ;%0D%0A        %7D%0D%0A%0D%0A
+        public boolean isBoolProperty() %7B%0D%0A            return boolProperty;%0D%0A        %7D%0D%0A%0D%0A
         @Overrid

Add test: a getter for a JavaBean property may only start with 'is' if it is the primitive 'int'. Integer object must be used with the 'get' prefix.