(function(global) {

    describe("jquery.formToObject tests", function() {

        beforeEach(function() {
            JKTestUtils.loadFixtures('/spec/javascripts/fixtures/formToObject.htm');
        });

        describe("Top level", function() {

            describe("text input named foo, val bar", function() {
                it("should have variable named foo, val bar", function() {
                    var o = $('#test1').formToObject();
                    expect(o.foo).toEqual("bar");
                });
            });

            describe("text area named foo, contents bar", function() {
                it("should have variable named foo, val bar", function() {
                    var o = $('#test1a').formToObject();
                    expect(o.foo).toEqual("bar");
                });
            });

            describe("single checkbox named foo, val bar", function() {
                it("should have variable named foo, val bar", function() {
                    var o = $('#test2').formToObject();
                    expect(o.foo).toEqual("bar");
                });
            });

            describe("multi checkboxes named foo, vals 'a' and 'b'", function() {
                it("should have variable named foo, val ['a','b']", function() {
                    var o = $('#test3').formToObject();
                    expect(o.foo).toEqual(['a','b']);
                });
            });

            describe("select named foo, selected op val 'a'", function() {
                it("should have variable named foo, val 'a'", function() {
                    var o = $('#test4').formToObject();
                    expect(o.foo).toEqual('a');
                });
            });

            describe("multiselect named foo, selected opts vals 'a', 'c'", function() {
                it("should have variable named foo, val ['a','c']", function() {
                    var o = $('#test5').formToObject();
                    expect(o.foo).toEqual(['a','c']);
                });
            });

            describe("single radio named foo, val bar", function() {
                it("should have variable named foo, val bar", function() {
                    var o = $('#test6').formToObject();
                    expect(o.foo).toEqual("bar");
                });
            });

        });


        describe("Second level", function() {

            describe("text input named foo.bar, val 'x'", function() {
                it("should have object foo with prop bar, value 'x'", function() {
                    var o = $('#test7').formToObject();
                    expect(o.foo.bar).toEqual("x");
                });
            });

            describe("multi checkboxes named foo.bar, vals 'a' and 'b'", function() {
                it("should have object named foo, prop bar, val ['a','b']", function() {
                    var o = $('#test9').formToObject();
                    expect(o.foo.bar).toEqual(['a','b']);
                });
            });


        });

        describe("Third level", function() {

            describe("text input named foo.bar.spam, val 'x'", function() {
                it("should have object foo with obj bar, with prop spam, value 'x'", function() {
                    var o = $('#test8').formToObject();
                    expect(o.foo.bar.spam).toEqual("x");
                });
            });

        });


        describe("Mixed cases", function() {

            describe("flipping in and out of hierarchy", function() {
                it("should properly capture all properties", function() {
                    var o = $('#test10').formToObject();
                    expect(o.foo.sponge).toEqual("99");
                    expect(o.foo.bar.potato).toEqual("mashed");
                    expect(o.apple).toEqual("sweet");
                    expect(o.foo.bar.strawberry).toEqual("ripe");
                    expect(o.foo.bar.kentucky.bluegrass.yards).toEqual("north");
                });
            });

        });

        describe("Bad cases", function() {
            describe("Overriding object with property", function() {
                it("should raise an error", function() {
                    expect( function() {
                        $('#error1').formToObject();
                    }).toThrow("Can't overwrite named structure");
                });
            });
        });

        describe("__OMIT__ special value", function() {
            describe("When value for key is __OMIT__", function() {
                it("should remove key from object", function() {
                    var o = $('#OMIT').formToObject();
                    expect(o.foo.sponge).toEqual("99");
                    expect(o.foo.bar.potato).toEqual("mashed");
                    expect("apple" in o).toBeFalsy('apple not in o');
                    // would be foo.bar.kentucky.bluegrass.yard - all empty should be gone:
                    expect("kentucky" in o.foo.bar).toBeFalsy('kentucky not in bar');
                });
            });

            describe("When resulting formToObject is {}", function() {
                it("should return null instead of {}", function() {
                    var o = $('#OMIT_ALL').formToObject();
                    expect(o).toBeNull();

                });

            });
        });


    });

})(window);