/*global describe:false, it:false */

require(["lib/architect/architect", "lib/chai/chai"], function (architect, chai) {
    "use client";
    var expect = chai.expect;
    
    expect.setupArchitectTest([
        "plugins/c9.core/ext",
        "plugins/c9.ide.ui/ui",
        "plugins/c9.core/util",
        "plugins/c9.ide.ui/lib_apf",
        "plugins/c9.ide.editors/editor",
        "plugins/c9.ide.clipboard/clipboard",
        "plugins/c9.ide.clipboard/html5",
        "plugins/c9.ide.editors/document",
        "plugins/c9.ide.editors/undomanager",
        
        // Mock plugins
        {
            consumes: [],
            provides: ["c9"],
            setup: expect.html.mocked
        },
        {
            consumes: ["apf", "ui", "Plugin"],
            provides: [
                "commands", "menus", "layout", "settings", "dialog.alert", 
                "dialog.error"
            ],
            setup: expect.html.mocked
        },
        {
            consumes: ["Editor", "Document"],
            provides: [],
            setup: main
        }
    ], architect);
    
    function main(options, imports, register) {
        var Editor = imports.Editor;
        var Document = imports.Document;
        
        describe('editor', function() {
            it('should load it\'s state from the constructor', function(done) {
                var exts = ["js", "txt"];
                var editor = new Editor("Ajax.org", [], exts);
                
                expect(editor.fileExtensions).to.equal(exts);
                
                done();
            });
            it('should emit document event and connect state get/setters with those of editor', function(done) {
                var exts = ["js", "txt"];
                var editor = new Editor("Ajax.org", [], exts);
                var doc = new Document();
                
                editor.type = "test";
                editor.name = "test1";
                
                var count = 0;
                editor.on("documentLoad", function(e) {
                    expect(e.doc).to.equal(doc);
                    count++;
                });
                editor.on("documentActivate", function(e) {
                    expect(e.doc).to.equal(doc);
                    count++;
                });
                editor.on("documentUnload", function(e) {
                    expect(e.doc).to.equal(doc);
                    count++;
                });
                doc.on("setState", function(e) {
                    count++;
                });
                doc.on("getState", function(e) {
                    count++;
                });
                editor.on("setState", function(e) {
                    expect(e.state).property("x").to.equal(1);
                    count++;
                });
                editor.on("getState", function(e) {
                    e.state.x = 1;
                    count++;
                });
                
                editor.loadDocument(doc);
                
                var state = doc.getState();
                doc.setState(state);

                editor.loadDocument(doc);
                
                doc.unload();
                
                if (count != 8) {
                    throw new Error("Not all events where called: " 
                        + count + " of 8");
                }
                
                expect(state).property("test").property("x").to.equal(1);
                
                done();
            });
            it('should emit clear when clearing the editor', function(done) {
                var editor = new Editor();
                editor.on("clear", function(e){ done(); })
                editor.clear();
            });
            it('should emit focus when focussing the editor', function(done) {
                var editor = new Editor();
                editor.on("focus", function(e){ done(); })
                editor.focus();
            });
            it('should emit validate when validating the editor', function(done) {
                var editor = new Editor();
                editor.on("validate", function(e) { 
                    expect(e.document).to.equal(1);
                    done(); 
                })
                editor.isValid(1);
            });
            it('should attach itself to a pane element', function(done) {
                var editor = new Editor();
                
                var count = 0;
                editor.on("draw", function(e) {
                    e.tab.on("DOMNodeRemovedFromDocument", function(){
                        if (count != 2)
                            throw new Error("Not all events where called: "
                                + count);
                        
                        done();
                    })
                    count++;
                });
                
                var pane = {
                    aml: {insertBefore: function(){ count++ }, 
                    getPage: function(){}},
                    on: function(){}
                }
                editor.attachTo(pane);
                
                editor.load("test");
                editor.unload();
            });
        });
        
        onload && onload();
    }
});