describe("Ext.Element.static", function() {
    var proto = Ext.Element,
        el, testEl,
        input, testInputEl,
        child1, child2, child3;
    
    beforeEach(function() {
        testEl = Ext.getBody().createChild({
            id      : 'ExtElementHelper',
            style   : 'position:absolute;',
            children: [
                {id: 'child1', style: 'position:absolute;'},
                {id: 'child2', style: 'position:absolute;'},
                {id: 'child3', style: 'position:absolute;'}
            ]
        });
        
        testInputEl = Ext.getBody().createChild({
            id  : 'ExtElementInputHelper',
            tag : 'input',
            type: 'text'
        });
        
        el    = new Ext.Element(Ext.getDom(testEl));
        input = new Ext.Element(Ext.getDom(testInputEl));
        
        child1 = Ext.get('child1');
        child2 = Ext.get('child2');
        child3 = Ext.get('child3');
    });
    
    afterEach(function() {
        testEl.remove();
        testInputEl.remove();
    });
    
    it("should have a defaultUnit", function() {
        expect(proto.defaultUnit).toEqual('px');
    });
    
    describe("addUnits", function() {
        it("should add the defualt unit", function() {
            expect(proto.addUnits(10)).toEqual('10px');
        });
        
        it("should not add the defualt unit", function() {
            expect(proto.addUnits('10px')).toEqual('10px');
        });
    });
    
    describe("parseBox", function() {
        describe("number", function() {
            describe("when 1 argument", function() {
                it("should return an object with correct values", function() {
                    expect(proto.parseBox(10)).toEqual({
                        top   : 10,
                        right : 10,
                        bottom: 10,
                        left  : 10
                    });
                });
            });
        });
        
        describe("string", function() {
            describe("when 1 argument", function() {
                it("should return an object with correct values", function() {
                    expect(proto.parseBox("10")).toEqual({
                        top   : 10,
                        right : 10,
                        bottom: 10,
                        left  : 10
                    });
                });
            });
            
            describe("when 2 arguments", function() {
                it("should return an object with correct values", function() {
                    expect(proto.parseBox("10 5")).toEqual({
                        top   : 10,
                        right : 5,
                        bottom: 10,
                        left  : 5
                    });
                });
            });
            
            describe("when 3 arguments", function() {
                it("should return an object with correct values", function() {
                    expect(proto.parseBox("10 5 15")).toEqual({
                        top   : 10,
                        right : 5,
                        bottom: 15,
                        left  : 5
                    });
                });
            });
            
            describe("when 4 arguments", function() {
                it("should return an object with correct values", function() {
                    expect(proto.parseBox("10 5 15 0")).toEqual({
                        top   : 10,
                        right : 5,
                        bottom: 15,
                        left  : 0
                    });
                });
            });
        });
    });
    
    describe("unitizeBox", function() {
        it("should return a string", function() {
            expect(proto.unitizeBox('10 5 15 0')).toEqual('10px 5px 15px 0px');
        });
    });
    
    describe("normalize", function() {
        it("should change border-radius > borderRadius", function() {
            expect(proto.normalize('border-radius')).toEqual('borderRadius');
        });
    });
    
    describe("getXY", function(){
        it("should return the x/y position", function(){
            var myEl = Ext.getBody().createChild({
                style: {
                    width: '5px',
                    height: '5px',
                    left: '6px',
                    top: '7px',
                    position: 'absolute'
                }
            }), xy = myEl.getXY();
            
            expect(xy[0]).toBe(6);
            expect(xy[1]).toBe(7);
            myEl.remove();
        });  
    });
    
    describe("getDocumentHeight", function() {
        it("should return the document height", function() {
            var result = proto.getDocumentHeight();
            
            expect(result).toBeDefined();
            expect(Ext.isNumber(result)).toBeTruthy();
        });
    });
    
    describe("getDocumentWidth", function() {
        it("should return the document width", function() {
            var result = proto.getDocumentWidth();
            
            expect(result).toBeDefined();
            expect(Ext.isNumber(result)).toBeTruthy();
        });
    });
    
    describe("getViewportHeight", function() {
        it("should return the window height", function() {
            var result = proto.getViewportHeight();
            
            expect(result).toBeDefined();
            expect(Ext.isNumber(result)).toBeTruthy();
        });
    });
    
    describe("getViewportWidth", function() {
        it("should return the window width", function() {
            var result = proto.getViewportWidth();
            
            expect(result).toBeDefined();
            expect(Ext.isNumber(result)).toBeTruthy();
        });
    });
    
    describe("getViewSize", function() {
        it("should return the window height and width", function() {
            expect(proto.getViewSize()).toEqual({
                width : window.innerWidth,
                height: window.innerHeight
            });
        });
    });
    
    describe("getOrientation", function() {
        it("should return the correct orientation", function() {
            expect(proto.getOrientation()).toEqual((window.innerHeight > window.innerWidth) ? 'portrait' : 'landscape');
        });
    });
    
    // See EXTJSIV-5800
    if (!Ext.isSafari3 && !Ext.isSafari4 && !Ext.isOpera && !Ext.isIE6 && !Ext.isIE7 && !Ext.isIE8) {
        describe("fromPoint", function() {
            it("should return nothing", function() {
                    expect(proto.fromPoint(-550000, -550000)).toBeNull();
            });
        });
    }
}, "/src/dom/Element.static.js");
