// Path: src/test/java/org/hildan/fxgson/TestClassesSimple.java
// static class CustomObject {
// 
//     String name;
// 
//     CustomObject(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) {
//             return true;
//         }
//         if (o == null || getClass() != o.getClass()) {
//             return false;
//         }
//         CustomObject that = (CustomObject) o;
//         return Objects.equals(name, that.name);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(name);
//     }
// }


import java.util.Objects;
import java.util.function.BiFunction;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.FloatProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ListProperty;
import javafx.beans.property.LongProperty;
import javafx.beans.property.MapProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SetProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleFloatProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleMapProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleSetProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.ObservableList;
import javafx.collections.ObservableMap;
import javafx.collections.ObservableSet;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import org.hildan.fxgson.TestClassesSimple.CustomObject;

    static class WithStringProp {
        StringProperty prop = new SimpleStringProperty();

        WithStringProp() {
        }

        WithStringProp(String value) {
            this.prop = new SimpleStringProperty(value);
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            WithStringProp that = (WithStringProp) o;
            return propEquals(prop, that.prop);
        }

        @Override
        public int hashCode() {
            return Objects.hash(prop);
        }
    }

    static class WithObjectProp {
// Path: src/test/java/org/hildan/fxgson/TestClassesSimple.java
// static class CustomObject {
// 
//     String name;
// 
//     CustomObject(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) {
//             return true;
//         }
//         if (o == null || getClass() != o.getClass()) {
//             return false;
//         }
//         CustomObject that = (CustomObject) o;
//         return Objects.equals(name, that.name);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(name);
//     }
// }


// Path: src/test/java/org/hildan/fxgson/TestClassesWithProp.java
import java.util.Objects;
import java.util.function.BiFunction;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.FloatProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ListProperty;
import javafx.beans.property.LongProperty;
import javafx.beans.property.MapProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SetProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleFloatProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleMapProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleSetProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.ObservableList;
import javafx.collections.ObservableMap;
import javafx.collections.ObservableSet;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import org.hildan.fxgson.TestClassesSimple.CustomObject;


    static class WithStringProp {
        StringProperty prop = new SimpleStringProperty();

        WithStringProp() {
        }

        WithStringProp(String value) {
            this.prop = new SimpleStringProperty(value);
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            WithStringProp that = (WithStringProp) o;
            return propEquals(prop, that.prop);
        }

        @Override
        public int hashCode() {
            return Objects.hash(prop);
        }
    }

    static class WithObjectProp {
        ObjectProperty<CustomObject> prop = new SimpleObjectProperty<>();