Upgrade to ExtJS 3.2.0 - Released 03/30/2010
[extjs.git] / test / unit / widgets / form / CompositeField.js
diff --git a/test/unit/widgets/form/CompositeField.js b/test/unit/widgets/form/CompositeField.js
new file mode 100644 (file)
index 0000000..7748b32
--- /dev/null
@@ -0,0 +1,201 @@
+/*!
+ * Ext JS Library 3.2.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/**
+ * Tests Ext.data.Store functionality
+ * @author Ed Spencer
+ */
+(function() {
+    var suite  = Ext.test.session.getSuite('Ext.form.CompositeField'),
+        assert = Y.Assert;
+    
+    //builds a simple composite field
+    function buildField(config) {
+        config = config || {};
+              
+        Ext.applyIf(config, {
+            items: [
+                {xtype: 'textfield', name: 'title',     width: 40, fieldLabel: 'Title'},
+                {xtype: 'textfield', name: 'firstName', flex:  1,  fieldLabel: 'First'},
+                {xtype: 'textfield', name: 'lastName',  flex:  1,  fieldLabel: 'Last'}
+            ]
+        });
+        
+        return new Ext.form.CompositeField(config);
+    };
+    
+    //builds and renders a FormPanel containing a composite field
+    function createForm() {
+        this.field1 = new Ext.form.TextField({name: 'firstName', flex: 1, fieldLabel: 'First'});
+        this.field2 = new Ext.form.TextField({name: 'lastName',  flex: 1, fieldLabel: 'Last'});
+        
+        this.composite = new Ext.form.CompositeField({
+            items: [
+                {xtype: 'textfield', name: 'title', width: 40, fieldLabel: 'Title'},
+                this.field1,
+                this.field2
+            ]
+        });
+        
+        this.form = new Ext.form.FormPanel({
+            renderTo: Ext.getBody(),
+            items   : [
+                this.composite
+            ]
+        });
+    };
+    
+    //use this to tearDown createForm
+    function destroyForm() {
+        this.form.destroy();
+    };
+    
+    suite.add(new Y.Test.Case({
+        name: 'building the label',
+        
+        testDefaultLabel: function() {
+            var field = buildField();
+            
+            assert.areSame('Title, First, Last', field.fieldLabel);
+        },
+        
+        testCustomFieldLabel: function() {
+            var field = buildField({fieldLabel: 'Custom label'});
+            
+            assert.areSame('Custom label', field.fieldLabel);
+        }
+    }));
+    
+    suite.add(new Y.Test.Case({
+        name: 'isDirty',
+        
+        setUp   : createForm,
+        tearDown: destroyForm,
+        
+        testFalseIfDisabled: function() {
+            this.composite.disable();
+
+            assert.isFalse(this.composite.isDirty());
+        },
+        
+        testIsClean: function() {
+            assert.isFalse(this.composite.isDirty());
+        },
+        
+        testOneFieldDirty: function() {
+            this.field1.isDirty = function() {
+                return true;
+            };
+
+            assert.isTrue(this.composite.isDirty());
+        }
+    }));
+    
+    suite.add(new Y.Test.Case({
+        name: 'reset',
+        
+        setUp   : createForm,
+        tearDown: destroyForm,
+        
+        testPropagatesToChildren: function() {
+            var callCount = 0;
+            
+            var resetFunc =function() {
+                callCount ++;
+            };
+            
+            this.field1.reset = resetFunc;
+            this.field2.reset = resetFunc;
+            
+            //we need to set this to avoid an unrelated error when resetting
+            //clearInvalid would otherwise try to clear a non-existent DOM node
+            this.composite.clearInvalid = Ext.emptyFn;
+            
+            this.composite.reset();
+            
+            assert.areEqual(2, callCount);
+        }
+    }));
+    
+    suite.add(new Y.Test.Case({
+        name: 'enabling and disabling',
+        
+        setUp   : createForm,
+        tearDown: destroyForm,
+        
+        testEnablePropagatesToChildren: function() {
+            var callCount = 0;
+            
+            var enableFunc =function() {
+                callCount ++;
+            };
+            
+            this.field1.enable = enableFunc;
+            this.field2.enable = enableFunc;
+            
+            this.composite.onEnable();
+            
+            assert.areEqual(2, callCount);
+        },
+        
+        testDisablePropagatesToChildren: function() {
+            var callCount = 0;
+            
+            var disableFunc = function() {
+                callCount ++;
+            };
+            
+            this.field1.disable = disableFunc;
+            this.field2.disable = disableFunc;
+            
+            this.composite.onDisable();
+            
+            assert.areEqual(2, callCount);
+        }
+    }));
+    
+    suite.add(new Y.Test.Case({
+        name: 'setting read only',
+        
+        setUp   : createForm,
+        tearDown: destroyForm,
+        
+        testSetsSubFields: function() {
+            var callCount = 0;
+            
+            var func = function() {
+                callCount ++;
+            };
+            
+            this.field1.setReadOnly = func;
+            this.field2.setReadOnly = func;
+            
+            this.composite.setReadOnly();
+            
+            assert.areEqual(2, callCount);
+        },
+        
+        testSetsReadOnly: function() {
+            var comp = this.composite;
+            
+            assert.isFalse(comp.readOnly);
+            
+            comp.setReadOnly();
+            
+            assert.isTrue(comp.readOnly);
+        }
+    }));
+    
+    // suite.add(new Y.Test.Case({
+    //     name: 'resizing',
+    //     
+    //     setUp   : createForm,
+    //     tearDown: destroyForm,
+    //     
+    //     testResizing
+    //     
+    // }));
+})();
\ No newline at end of file