');var i=Raphael(h,e+50*b,f+100*b),j=i.path("M 0,0 c 3.5433333,-4.7243333 7.0866667,-9.4486667 10.63,-14.173 -14.173,0 -28.346,0 -42.519,0 C -35.432667,-9.4486667 -38.976333,-4.7243333 -42.52,0 -28.346667,0 -14.173333,0 0,0 z m 277.031,28.346 c -14.17367,0 -28.34733,0 -42.521,0 C 245.14,14.173 255.77,0 266.4,-14.173 c -14.17267,0 -28.34533,0 -42.518,0 C 213.25167,0 202.62133,14.173 191.991,28.346 c -14.17333,0 -28.34667,0 -42.52,0 14.17333,-18.8976667 28.34667,-37.7953333 42.52,-56.693 -7.08667,-9.448667 -14.17333,-18.897333 -21.26,-28.346 -14.173,0 -28.346,0 -42.519,0 7.08667,9.448667 14.17333,18.897333 21.26,28.346 -14.17333,18.8976667 -28.34667,37.7953333 -42.52,56.693 -14.173333,0 -28.346667,0 -42.52,0 10.63,-14.173 21.26,-28.346 31.89,-42.519 -14.390333,0 -28.780667,0 -43.171,0 C 42.520733,1.330715e-4 31.889933,14.174867 21.26,28.347 c -42.520624,6.24e-4 -85.039187,-8.13e-4 -127.559,-0.001 11.220667,-14.961 22.441333,-29.922 33.662,-44.883 -6.496,-8.661 -12.992,-17.322 -19.488,-25.983 5.905333,0 11.810667,0 17.716,0 -10.63,-14.173333 -21.26,-28.346667 -31.89,-42.52 14.173333,0 28.346667,0 42.52,0 10.63,14.173333 21.26,28.346667 31.89,42.52 14.173333,0 28.3466667,0 42.52,0 -10.63,-14.173333 -21.26,-28.346667 -31.89,-42.52 14.1733333,0 28.3466667,0 42.52,0 10.63,14.173333 21.26,28.346667 31.89,42.52 14.390333,0 28.780667,0 43.171,0 -10.63,-14.173333 -21.26,-28.346667 -31.89,-42.52 42.51967,0 85.03933,0 127.559,0 10.63033,14.173333 21.26067,28.346667 31.891,42.52 14.17267,0 28.34533,0 42.518,0 -10.63,-14.173333 -21.26,-28.346667 -31.89,-42.52 14.17367,0 28.34733,0 42.521,0 14.17333,18.897667 28.34667,37.795333 42.52,56.693 -14.17333,18.8976667 -28.34667,37.7953333 -42.52,56.693 z");j.scale(b,-b,0,0),j.translate(120*b,f),j.attr("fill",c),j.attr("stroke",d),j.attr("stroke-width",g)},debounce:function(a,b){var c,d;return function(){var e=arguments,f=this,g=function(){d=a.apply(f,e)};return clearTimeout(c),c=setTimeout(g,b),d}},id:function(a){if(b=e++ +"",c=a?a+b:"aui-uid-"+b,document.getElementById(c)){if(c=c+"-"+(new Date).getTime(),document.getElementById(c))throw new Error("ERROR: timestamped fallback ID "+c+" exists. AJS.id stopped.");return c}return c},_addID:function(a,b){var c=AJS.$(a),d=b||!1;c.each(function(){var a=AJS.$(this);a.attr("id")||a.attr("id",AJS.id(d))})},enable:function(a,b){var c=AJS.$(a);return"undefined"==typeof b&&(b=!0),c.each(function(){this.disabled=!b})}};if("undefined"!=typeof AJS)for(var h in AJS)g[h]=AJS[h];var i=function(){var a=null;return arguments.length&&"string"==typeof arguments[0]&&(a=AJS.$(document.createElement(arguments[0])),2===arguments.length&&a.html(arguments[1])),a};for(var j in g)i[j]=g[j];return i}(),AJS.$(function(){var a=AJS.$("body");a.data("auiVersion")||a.attr("data-aui-version",AJS.version),AJS.populateParameters()}),AJS.$.ajaxSettings.traditional=!0}(),AJS.format=function(){var a=/'(?!')/g,b=/^\d+$/,c=/^(\d+),number$/,d=/^(\d+)\,choice\,(.+)/,e=/^(\d+)([#<])(.+)/,f=function(a,f){var g,h="";if(g=a.match(b))h=f.length>++a?f[a]:"";else if(g=a.match(c))h=f.length>++g[1]?f[g[1]]:"";else if(g=a.match(d)){var i=f.length>++g[1]?f[g[1]]:null;if(null!==i){for(var j=g[2].split("|"),k=null,l=0;l
i){if(k){h=k;break}h=m[3];break}if(i==n&&"#"==m[2]){h=m[3];break}l==j.length-1&&(h=m[3]),k=m[3]}var o=[h].concat(Array.prototype.slice.call(f,1));h=AJS.format.apply(AJS,o)}}return h},g=function(a){for(var b=!1,c=-1,d=0,e=0;e0&&(d--,0===d)){var g=[];return g.push(a.substring(0,e+1)),g.push(a.substring(0,c)),g.push(a.substring(c+1,e)),g}}return null},h=function(b){for(var c=arguments,d="",e=g(b);e;)b=b.substring(e[0].length),d+=e[1].replace(a,""),d+=f(e[2],c),e=g(b);return d+=b.replace(a,"")};return h.apply(AJS,arguments)},AJS.I18n={getText:function(a){var b=Array.prototype.slice.call(arguments,1);return AJS.I18n.keys&&Object.prototype.hasOwnProperty.call(AJS.I18n.keys,a)?AJS.format.apply(null,[AJS.I18n.keys[a]].concat(b)):a}},function(a){AJS._internal=AJS._internal||{},AJS._internal.widget=function(b,c){var d="_aui-widget-"+b;return function(b,e){var f,g;a.isPlainObject(b)?g=b:(f=b,g=e);var h,i=f&&a(f);return i&&i.data(d)?h=i.data(d):(h=new c(i,g||{}),i=h.$el,i.data(d,h)),h}}}(AJS.$),AJS._internal||(AJS._internal={}),function(a){AJS._internal.browser={};var b=null;AJS._internal.browser.supportsCalc=function(){if(null===b){var c=a('
');b=20===c.appendTo(document.documentElement).height(),c.remove()}return b}}(AJS.$),AJS.I18n.keys={},AJS.I18n.keys["aui.words.add"]="Add",AJS.I18n.keys["aui.words.update"]="Update",AJS.I18n.keys["aui.words.delete"]="Delete",AJS.I18n.keys["aui.words.remove"]="Remove",AJS.I18n.keys["aui.words.cancel"]="Cancel",AJS.I18n.keys["aui.words.loading"]="Loading",AJS.I18n.keys["aui.words.close"]="Close",AJS.I18n.keys["aui.enter.value"]="Enter value",AJS.I18n.keys["aui.keyboard.shortcut.type.x"]="Type ''{0}''",AJS.I18n.keys["aui.keyboard.shortcut.then.x"]="then ''{0}''",AJS.I18n.keys["aui.keyboard.shortcut.or.x"]="OR ''{0}''",AJS.I18n.keys["aui.sidebar.expand.tooltip"]="Expand sidebar ( [ )",AJS.I18n.keys["aui.sidebar.collapse.tooltip"]="Collapse sidebar ( [ )",AJS.I18n.keys["aui.words.more"]="More",AJS.I18n.keys["aui.validation.message.maxlength"]="Must be fewer than {0} characters",AJS.I18n.keys["aui.validation.message.minlength"]="Must be greater than {0} characters",AJS.I18n.keys["aui.validation.message.matchingfield"]="{0} and {1} do not match.",AJS.I18n.keys["aui.validation.message.doesnotcontain"]="Do not include the phrase {0} in this field",AJS.I18n.keys["aui.validation.message.pattern"]="This field does not match the required format",AJS.I18n.keys["aui.validation.message.required"]="This is a required field",AJS.I18n.keys["aui.validation.message.validnumber"]="Please enter a valid number",AJS.I18n.keys["aui.validation.message.min"]="Enter a value greater than {0}",AJS.I18n.keys["aui.validation.message.max"]="Enter a value less than {0}",AJS.I18n.keys["aui.validation.message.dateformat"]="Enter a valid date",AJS.I18n.keys["aui.validation.message.minchecked"]="Tick at least {0} checkboxes.",AJS.I18n.keys["aui.validation.message.maxchecked"]="Tick at most {0} checkboxes.",function(a){var b;AJS.dim=function(c,d){return b||(b=a(document.body)),c===!0&&AJS.log("DEPRECATED: useShim is calculated by dim() now"),AJS.dim.$dim||(AJS.dim.$dim=AJS("div").addClass("aui-blanket"),AJS.dim.$dim.attr("tabindex","0"),d&&AJS.dim.$dim.css({zIndex:d}),a.browser.msie&&AJS.dim.$dim.css({width:"200%",height:Math.max(a(document).height(),a(window).height())+"px"}),a("body").append(AJS.dim.$dim),AJS.dim.cachedOverflow=b.css("overflow"),b.css("overflow","hidden")),AJS.dim.$dim},AJS.undim=function(){if(AJS.dim.$dim&&(AJS.dim.$dim.remove(),AJS.dim.$dim=null,AJS.dim.$shim&&(AJS.dim.$shim.remove(),AJS.dim.$shim=null),b&&b.css("overflow",AJS.dim.cachedOverflow),a.browser.safari)){var c=a(window).scrollTop();a(window).scrollTop(10+5*(10==c)).scrollTop(c)}}}(AJS.$),AJS.FocusManager=function(a){function b(){this._focusTrapStack=[],a(document).on("focusout",{focusTrapStack:this._focusTrapStack},f)}function c(a,b){b.push(a)}function d(a){a.pop()}function e(a){return a.is(".aui-dialog2")}function f(a){var b=a.data.focusTrapStack;if(a.relatedTarget&&0!==b.length){var c=b[b.length-1],d=a.target,e=a.relatedTarget,f=c.find(":aui-tabbable"),g=AJS.$(f.first()),h=AJS.$(f.last()),i=0===c.has(e).length,j=i&&e;j&&(g.is(d)?h.focus():h.is(d)&&g.focus())}}!function(){function b(b){return!a(b).parents().andSelf().filter(function(){return"hidden"===a.css(this,"visibility")||a.expr.filters.hidden(this)}).length}function c(c,d){var e=c.nodeName.toLowerCase();if("area"===e){var f=c.parentNode,g=f.name,h=a("img[usemap=#"+g+"]").get();return c.href&&g&&"map"===f.nodeName.toLowerCase()?h&&b(h):!1}var i=/input|select|textarea|button|object/.test(e),j="a"===e,k=c.href||d;return(i?!c.disabled:j?k:d)&&b(c)}function d(b){var d=a.attr(b,"tabindex"),e=isNaN(d),f=e||d>=0;return f&&c(b,!e)}a.extend(a.expr[":"],{"aui-focusable":function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},"aui-tabbable":d})}();var g="_aui-focus-restore";return b.defaultFocusSelector=":aui-tabbable",b.prototype.enter=function(d){if(d.data(g,a(document.activeElement)),"false"!==d.attr("data-aui-focus")){var f=d.attr("data-aui-focus-selector")||b.defaultFocusSelector,h=d.is(f)?d:d.find(f);h.first().focus()}e(d)&&c(d,this._focusTrapStack)},b.prototype.exit=function(b){e(b)&&d(this._focusTrapStack);var c=document.activeElement;(b[0]===c||b.has(c).length)&&a(c).blur();var f=b.data(g);f&&f.length&&(b.removeData(g),f.focus())},b.global=new b,b}(AJS.$),function(a){function b(b){this.$el=a(b||'
')}var c="_aui-internal-layer-",d="_aui-internal-layer-global-";b.prototype.changeSize=function(a,b){return this.$el.css("width",a),this.$el.css("height","content"===b?"":b),this},b.prototype.on=function(a,b){return this.$el.on(c+a,b),this},b.prototype.off=function(a,b){return this.$el.off(c+a,b),this},b.prototype.show=function(){if(this.$el.is(":visible"))return this;var b=AJS.$.Event(c+"beforeShow");this.$el.trigger(b);var e=AJS.$.Event(d+"beforeShow");return a(document).trigger(e,[this.$el]),b.isDefaultPrevented()||e.isDefaultPrevented()||(AJS.LayerManager.global.push(this.$el),this.$el.attr("data-aui-alignment")&&this.$el[0]._tether.enable()),this},b.prototype.hide=function(){if(!this.$el.is(":visible"))return this;var b=AJS.$.Event(c+"beforeHide");this.$el.trigger(b);var e=AJS.$.Event(d+"beforeHide");return a(document).trigger(e,[this.$el]),b.isDefaultPrevented()||e.isDefaultPrevented()||AJS.LayerManager.global.popUntil(this.$el),this},b.prototype.isVisible=function(){return"false"===this.$el.attr("aria-hidden")},b.prototype.remove=function(){this.hide(),this.$el[0]._tether&&this.$el[0]._tether.destroy(),this.$el.remove(),this.$el=null},b.prototype._showLayer=function(b){this.$el.parent().is("body")||this.$el.appendTo(document.body),this.$el.data("_aui-layer-cached-z-index",this.$el.css("z-index")),this.$el.css("z-index",b),this.$el.attr("aria-hidden","false"),AJS.FocusManager.global.enter(this.$el),this.$el.trigger(c+"show"),a(document).trigger(d+"show",[this.$el])},b.prototype._hideLayer=function(){AJS.FocusManager.global.exit(this.$el),this.$el.attr("aria-hidden","true"),this.$el.css("z-index",this.$el.data("_aui-layer-cached-z-index")||""),this.$el.data("_aui-layer-cached-z-index",""),this.$el.trigger(c+"hide"),a(document).trigger(d+"hide",[this.$el])},b.prototype.isBlanketed=function(){return"true"===this.$el.attr("data-aui-blanketed")},b.prototype.isModal=function(){return"true"===this.$el.attr("data-aui-modal")},AJS.layer=AJS._internal.widget("layer",b),AJS.layer.on=function(b,c){return a(document).on(d+b,c),this},AJS.layer.off=function(b,c){return a(document).off(d+b,c),this}}(AJS.$),function(){function a(a,b){for(var c=a.length;c--;)if(b(a[c]))return c;return-1}function b(b,c){return a(b,function(a){return a[0]===c[0]})}function c(b){return a(b,function(a){return AJS.layer(a).isBlanketed()})}function d(a){var b;if(a.length){var c=a[a.length-1],d=parseInt(c.css("z-index"),10);b=(isNaN(d)?0:d)+100}else b=0;return Math.max(3e3,b)}function e(){this._stack=[]}e.prototype.push=function(a){if(b(this._stack,a)>=0)throw new Error("The given element is already an active layer");var e=AJS.layer(a),f=d(this._stack);e._showLayer(f),e.isBlanketed()&&(c(this._stack)>=0&&AJS.undim(),AJS.dim(!1,f-20)),this._stack.push(a)},e.prototype.popUntil=function(a){var d=b(this._stack,a);if(0>d)return null;var e=this._stack.slice(d);this._stack=this._stack.slice(0,d);var f=c(e);if(f>=0){AJS.undim();var g=c(this._stack);g>=0&&AJS.dim(!1,this._stack[g].css("z-index")-20)}for(var h;e.length;)h=e.pop(),AJS.layer(h)._hideLayer();return h},e.prototype.getTopLayer=function(){if(!this._stack.length)return null;var a=this._stack[this._stack.length-1];return a},e.prototype.popTopIfNonModal=function(){var a=this.getTopLayer();return!a||AJS.layer(a).isModal()?null:this.popUntil(a)},e.prototype.popUntilTopBlanketed=function(){var a=c(this._stack);if(0>a)return null;var b=this._stack[a];return AJS.layer(b).isModal()?null:this.popUntil(b)},AJS.LayerManager=e}(AJS.$),function(){AJS.keyCode={ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}(AJS.$),function(a){AJS.LayerManager.global=new AJS.LayerManager,a(document).on("keydown",function(a){if(a.keyCode===AJS.keyCode.ESCAPE){var b=AJS.LayerManager.global.popTopIfNonModal();b&&a.preventDefault()}}).on("click",".aui-blanket",function(a){var b=AJS.LayerManager.global.popUntilTopBlanketed();b&&a.preventDefault()})}(AJS.$),function(a){function b(a){jQuery.each(e,function(b,c){var d="data-"+b;a[0].hasAttribute(d)||a.attr(d,c)})}function c(c){this.$el=a(c?c:AJS.parseHtml(a(aui.dialog.dialog2({})))),b(this.$el)}function d(b){AJS.layer.on(b,function(c,d){if(d.is(".aui-dialog2")){var e=AJS.$.Event(f+b);return a(document).trigger(e,[d]),!e.isDefaultPrevented()}return!0})}var e={"aui-focus":"false","aui-blanketed":"true"};c.prototype.on=function(a,b){return AJS.layer(this.$el).on(a,b),this},c.prototype.off=function(a,b){return AJS.layer(this.$el).off(a,b),this},c.prototype.show=function(){var a=AJS.layer(this.$el);return a.show(),this},c.prototype.hide=function(){return AJS.layer(this.$el).hide(),this},c.prototype.remove=function(){return AJS.layer(this.$el).remove(),this},AJS.dialog2=AJS._internal.widget("dialog2",c);for(var f="_aui-internal-dialog2-global-",g=["show","hide","beforeShow","beforeHide"],h=0;hd?a.css("z-index"):d});var e=function(b,e){return a.width=b=b||a.width,a.height=e=e||a.height,c.css({marginTop:-Math.round(e/2)+"px",marginLeft:-Math.round(b/2)+"px",width:b,height:e,"z-index":parseInt(d,10)+2}),arguments.callee}(a.width,a.height);AJS.$("body").append(c),c.hide(),AJS.enable(c);var f=AJS.$(".aui-blanket"),g=function(a,b){var c=AJS.$(a,b);return c.length?(c.focus(),!0):!1},h=function(b){if(0===AJS.$(".dialog-page-body",b).find(":focus").length){if(a.focusSelector)return g(a.focusSelector,b);var c=":input:visible:enabled:first";g(c,AJS.$(".dialog-page-body",b))||g(c,AJS.$(".dialog-button-panel",b))||g(c,AJS.$(".dialog-page-menu",b))}},i={changeSize:function(b,c){(b&&b!=a.width||c&&c!=a.height)&&e(b,c),this.show()},show:function(){var b=function(){AJS.$(document).off("keydown",a.keypressListener).on("keydown",a.keypressListener),AJS.dim(),f=AJS.$(".aui-blanket"),0!=f.size()&&a.closeOnOutsideClick&&f.click(function(){c.is(":visible")&&i.hide()}),c.show(),AJS.popup.current=this,h(c),AJS.$(document).trigger("showLayer",["popup",this])};b.call(this),this.show=b},hide:function(){AJS.$(document).unbind("keydown",a.keypressListener),f.unbind(),this.element.hide(),0==AJS.$(".aui-dialog:visible").size()&&AJS.undim();var b=document.activeElement;this.element.has(b).length&&b.blur(),AJS.$(document).trigger("hideLayer",["popup",this]),AJS.popup.current=null,this.enable()},element:c,remove:function(){c.remove(),this.element=null},disable:function(){this.disabled||(this.popupBlanket=AJS.$("
").css({height:c.height(),width:c.width()}),c.append(this.popupBlanket),this.disabled=!0)},enable:function(){this.disabled&&(this.disabled=!1,this.popupBlanket.remove(),this.popupBlanket=null)}};return i},function(){function a(a,b,c,d){a.buttonpanel||a.addButtonPanel(),this.page=a,this.onclick=c,this._onclick=function(b){return c.call(this,a.dialog,a,b)===!0},this.item=AJS("button",b).addClass("button-panel-button"),d&&this.item.addClass(d),"function"==typeof c&&this.item.click(this._onclick),a.buttonpanel.append(this.item),this.id=a.button.length,a.button[this.id]=this}function b(a,b,c,d,e){a.buttonpanel||a.addButtonPanel(),e||(e="#"),this.page=a,this.onclick=c,this._onclick=function(b){return c.call(this,a.dialog,a,b)===!0},this.item=AJS("a",b).attr("href",e).addClass("button-panel-link"),d&&this.item.addClass(d),"function"==typeof c&&this.item.click(this._onclick),a.buttonpanel.append(this.item),this.id=a.button.length,a.button[this.id]=this}function c(a,b){var c="left"==a?-1:1;return function(a){var d=this.page[b];if(this.id!=(1==c?d.length-1:0)){c*=a||1,d[this.id+c].item[0>c?"before":"after"](this.item),d.splice(this.id,1),d.splice(this.id+c,0,this);for(var e=0,f=d.length;f>e;e++)"panel"==b&&this.page.curtab==d[e].id&&(this.page.curtab=e),d[e].id=e}return this}}function d(a){return function(){this.page[a].splice(this.id,1);for(var b=0,c=this.page[a].length;c>b;b++)this.page[a][b].id=b;this.item.remove()}}a.prototype.moveUp=a.prototype.moveLeft=c("left","button"),a.prototype.moveDown=a.prototype.moveRight=c("right","button"),a.prototype.remove=d("button"),a.prototype.html=function(a){return this.item.html(a)},a.prototype.onclick=function(a){return"undefined"==typeof a?this.onclick:(this.item.unbind("click",this._onclick),this._onclick=function(b){return a.call(this,page.dialog,page,b)===!0},"function"==typeof a&&this.item.click(this._onclick),void 0)};var e=20,f=function(a,b,c,d,f){c instanceof AJS.$||(c=AJS.$(c)),this.dialog=a.dialog,this.page=a,this.id=a.panel.length,this.button=AJS("button").html(b).addClass("item-button"),f&&(this.button[0].id=f),this.item=AJS("li").append(this.button).addClass("page-menu-item"),this.body=AJS("div").append(c).addClass("dialog-panel-body").css("height",a.dialog.height+"px"),this.padding=e,d&&this.body.addClass(d);var g=a.panel.length,h=this;a.menu.append(this.item),a.body.append(this.body),a.panel[g]=this;var i=function(){var b;a.curtab+1&&(b=a.panel[a.curtab],b.body.hide(),b.item.removeClass("selected"),"function"==typeof b.onblur&&b.onblur()),a.curtab=h.id,h.body.show(),h.item.addClass("selected"),"function"==typeof h.onselect&&h.onselect(),"function"==typeof a.ontabchange&&a.ontabchange(h,b)
+};this.button.click?this.button.click(i):(AJS.log("atlassian-dialog:Panel:constructor - this.button.click false"),this.button.onclick=i),i(),0==g?a.menu.css("display","none"):a.menu.show()};f.prototype.select=function(){this.button.click()},f.prototype.moveUp=f.prototype.moveLeft=c("left","panel"),f.prototype.moveDown=f.prototype.moveRight=c("right","panel"),f.prototype.remove=d("panel"),f.prototype.html=function(a){return a?(this.body.html(a),this):this.body.html()},f.prototype.setPadding=function(a){return isNaN(+a)||(this.body.css("padding",+a),this.padding=+a,this.page.recalcSize()),this};var g=56,h=51,i=50,j=function(a,b){this.dialog=a,this.id=a.page.length,this.element=AJS("div").addClass("dialog-components"),this.body=AJS("div").addClass("dialog-page-body"),this.menu=AJS("ul").addClass("dialog-page-menu").css("height",a.height+"px"),this.body.append(this.menu),this.curtab,this.panel=[],this.button=[],b&&this.body.addClass(b),a.popup.element.append(this.element.append(this.menu).append(this.body)),a.page[a.page.length]=this};j.prototype.recalcSize=function(){for(var a=this.header?g:0,b=this.buttonpanel?h:0,c=this.panel.length;c--;){var d=this.dialog.height-a-b;this.panel[c].body.css("height",d),this.menu.css("height",d)}},j.prototype.addButtonPanel=function(){this.buttonpanel=AJS("div").addClass("dialog-button-panel"),this.element.append(this.buttonpanel)},j.prototype.addPanel=function(a,b,c,d){return new f(this,a,b,c,d),this.recalcSize(),this},j.prototype.addHeader=function(a,b){return this.header&&this.header.remove(),this.header=AJS("h2").text(a||"").addClass("dialog-title"),b&&this.header.addClass(b),this.element.prepend(this.header),this.recalcSize(),this},j.prototype.addButton=function(b,c,d){return new a(this,b,c,d),this.recalcSize(),this},j.prototype.addLink=function(a,c,d,e){return new b(this,a,c,d,e),this.recalcSize(),this},j.prototype.gotoPanel=function(a){this.panel[a.id||a].select()},j.prototype.getCurrentPanel=function(){return this.panel[this.curtab]},j.prototype.hide=function(){this.element.hide()},j.prototype.show=function(){this.element.show()},j.prototype.remove=function(){this.element.remove()},AJS.Dialog=function(a,b,c){var d={};+a||(d=Object(a),a=d.width,b=d.height,c=d.id),this.height=b||480,this.width=a||640,this.id=c,d=AJS.$.extend({},d,{width:this.width,height:this.height,id:this.id}),this.popup=AJS.popup(d),this.popup.element.addClass("aui-dialog"),this.page=[],this.curpage=0,new j(this)},AJS.Dialog.prototype.addHeader=function(a,b){return this.page[this.curpage].addHeader(a,b),this},AJS.Dialog.prototype.addButton=function(a,b,c){return this.page[this.curpage].addButton(a,b,c),this},AJS.Dialog.prototype.addLink=function(a,b,c,d){return this.page[this.curpage].addLink(a,b,c,d),this},AJS.Dialog.prototype.addSubmit=function(a,b){return this.page[this.curpage].addButton(a,b,"button-panel-submit-button"),this},AJS.Dialog.prototype.addCancel=function(a,b){return this.page[this.curpage].addLink(a,b,"button-panel-cancel-link"),this},AJS.Dialog.prototype.addButtonPanel=function(){return this.page[this.curpage].addButtonPanel(),this},AJS.Dialog.prototype.addPanel=function(a,b,c,d){return this.page[this.curpage].addPanel(a,b,c,d),this},AJS.Dialog.prototype.addPage=function(a){return new j(this,a),this.page[this.curpage].hide(),this.curpage=this.page.length-1,this},AJS.Dialog.prototype.nextPage=function(){return this.page[this.curpage++].hide(),this.curpage>=this.page.length&&(this.curpage=0),this.page[this.curpage].show(),this},AJS.Dialog.prototype.prevPage=function(){return this.page[this.curpage--].hide(),this.curpage<0&&(this.curpage=this.page.length-1),this.page[this.curpage].show(),this},AJS.Dialog.prototype.gotoPage=function(a){return this.page[this.curpage].hide(),this.curpage=a,this.curpage<0?this.curpage=this.page.length-1:this.curpage>=this.page.length&&(this.curpage=0),this.page[this.curpage].show(),this},AJS.Dialog.prototype.getPanel=function(a,b){var c=null==b?this.curpage:a;return null==b&&(b=a),this.page[c].panel[b]},AJS.Dialog.prototype.getPage=function(a){return this.page[a]},AJS.Dialog.prototype.getCurrentPanel=function(){return this.page[this.curpage].getCurrentPanel()},AJS.Dialog.prototype.gotoPanel=function(a,b){if(null!=b){var c=a.id||a;this.gotoPage(c)}this.page[this.curpage].gotoPanel("undefined"==typeof b?a:b)},AJS.Dialog.prototype.show=function(){return this.popup.show(),AJS.trigger("show.dialog",{dialog:this}),this},AJS.Dialog.prototype.hide=function(){return this.popup.hide(),AJS.trigger("hide.dialog",{dialog:this}),this},AJS.Dialog.prototype.remove=function(){this.popup.hide(),this.popup.remove(),AJS.trigger("remove.dialog",{dialog:this})},AJS.Dialog.prototype.disable=function(){return this.popup.disable(),this},AJS.Dialog.prototype.enable=function(){return this.popup.enable(),this},AJS.Dialog.prototype.get=function(a){var b=[],c=this,d='#([^"][^ ]*|"[^"]*")',e=":(\\d+)",f="page|panel|button|header",g="(?:("+f+")(?:"+d+"|"+e+")?|"+d+")",h=new RegExp("(?:^|,)\\s*"+g+"(?:\\s+"+g+")?\\s*(?=,|$)","ig");(a+"").replace(h,function(a,d,e,f,g,h,i,j,k){d=d&&d.toLowerCase();var l=[];if("page"==d&&c.page[f]?(l.push(c.page[f]),d=h,d=d&&d.toLowerCase(),e=i,f=j,g=k):l=c.page,e=e&&(e+"").replace(/"/g,""),i=i&&(i+"").replace(/"/g,""),g=g&&(g+"").replace(/"/g,""),k=k&&(k+"").replace(/"/g,""),d||g)for(var m=l.length;m--;){if(g||"panel"==d&&(e||!e&&null==f))for(var n=l[m].panel.length;n--;)(l[m].panel[n].button.html()==g||l[m].panel[n].button.html()==e||"panel"==d&&!e&&null==f)&&b.push(l[m].panel[n]);if(g||"button"==d&&(e||!e&&null==f))for(var n=l[m].button.length;n--;)(l[m].button[n].item.html()==g||l[m].button[n].item.html()==e||"button"==d&&!e&&null==f)&&b.push(l[m].button[n]);l[m][d]&&l[m][d][f]&&b.push(l[m][d][f]),"header"==d&&l[m].header&&b.push(l[m].header)}else b=b.concat(l)});for(var i={length:b.length},j=b.length;j--;){i[j]=b[j];for(var k in b[j])k in i||!function(a){i[a]=function(){for(var b=this.length;b--;)"function"==typeof this[b][a]&&this[b][a].apply(this[b],arguments)}}(k)}return i},AJS.Dialog.prototype.updateHeight=function(){for(var a=0,b=AJS.$(window).height()-g-h-2*i,c=0;this.getPanel(c);c++)this.getPanel(c).body.css({height:"auto",display:"block"}).outerHeight()>a&&(a=Math.min(b,this.getPanel(c).body.outerHeight())),c!==this.page[this.curpage].curtab&&this.getPanel(c).body.css({display:"none"});for(c=0;this.getPanel(c);c++)this.getPanel(c).body.css({height:a||this.height});this.page[0].menu.height(a),this.height=a+g+h+1,this.popup.changeSize(void 0,this.height)},AJS.Dialog.prototype.isMaximised=function(){return this.popup.element.outerHeight()>=AJS.$(window).height()-2*i},AJS.Dialog.prototype.getCurPanel=function(){return this.getPanel(this.page[this.curpage].curtab)},AJS.Dialog.prototype.getCurPanelButton=function(){return this.getCurPanel().button}}(),function(a){function b(a){a.preventDefault()}function c(a){if(a.click)a.click();else{var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}function d(b,c){return b===c||a.contains(c,b)}function e(b){b instanceof AJS.$||(b=a(b));var c=b.attr("aria-owns"),d=b.attr("aria-haspopup"),e=document.getElementById(c);if(e)return a(e);if(!c)throw new Error("Dropdown 2 trigger required attribute not set: aria-owns");if(!d)throw new Error("Dropdown 2 trigger required attribute not set: aria-haspopup");if(!e)throw new Error("Dropdown 2 trigger aria-owns attr set to nonexistent id: "+c);throw new Error("Dropdown 2 trigger unknown error. I don't know what you did, but there's smoke everywhere. Consult the documentation.")}var f=a(document),g=null,h=function(){function c(b){g||1!==b.which||(g=!0,f.bind("mouseup mouseleave",d),a(this).trigger("aui-button-invoke"))}function d(){f.unbind("mouseup mouseleave",d),setTimeout(function(){g=!1},0)}function e(){g||a(this).trigger("aui-button-invoke")}var g=!1;return"undefined"==typeof document.addEventListener?{click:e,"click selectstart":b,mousedown:function(a){function b(a){switch(a.toElement){case null:case d:case document.body:case document.documentElement:a.returnValue=!1}}var d=this,e=document.activeElement;c.call(this,a),null!==e&&(e.attachEvent("onbeforedeactivate",b),setTimeout(function(){e.detachEvent("onbeforedeactivate",b)},0))}}:{click:e,"click mousedown":b,mousedown:c}}(),i={"aui-button-invoke":function(h,i){function j(b,c){b.each(function(){var b=a(this);b.attr("role",c),b.hasClass("checked")||b.hasClass("aui-dropdown2-checked")?(b.attr("aria-checked","true"),"radio"==c&&b.closest("ul").attr("role","radiogroup")):b.attr("aria-checked","false")})}function k(){var b=D.offset(),c=D.outerWidth();C.css({left:0,top:0});var d=C.outerWidth(),e=a("body").outerWidth(!0),f=Math.max(parseInt(C.css("min-width"),10),c),g=D.data("container")||!1,h="left";E||C.css("min-width",f+"px");var i=b.left,j=b.top+D.outerHeight();if(E){var k=3;i=b.left+K.outerWidth()-k,j=b.top}if(i+d>e&&i+c>=d&&(i=b.left+c-d,E&&(i=b.left-d),h="right"),g){var l=(D.closest(g),D.offset().left+D.outerWidth()),m=l+d;f>=d&&(d=f),m>l&&(i=l-d,h="right")}C.attr({"data-dropdown2-alignment":h,"aria-hidden":"false"}).css({display:"block",left:i+"px",top:j+"px"}),C.appendTo(document.body)}function l(){z(),B("off"),setTimeout(function(){C.css("display","none").css("min-width","").insertAfter(D).attr("aria-hidden","true"),E||D.removeClass("active aui-dropdown2-active"),r().removeClass("active aui-dropdown2-active"),C.removeClass("aui-dropdown2-in-toolbar"),C.removeClass("aui-dropdown2-in-buttons"),G?C.insertBefore(G):C.appendTo(F),C.trigger("aui-dropdown2-hide")},0)}function m(){l(),E&&K.trigger("aui-dropdown2-hide-all")}function n(a){E&&a.target===K[0]&&l()}function o(a){return!a.is(".disabled, .aui-dropdown2-disabled, [aria-disabled=true]")}function p(a){return a.hasClass("aui-dropdown2-sub-trigger")}function q(b,c){if(p(b)){c=a.extend({},c,{$menu:J});var d=e(b);d.is(":visible")?d.trigger("aui-dropdown2-select-first"):b.trigger("aui-button-invoke",c)}}function r(){return C.find("a.active,a.aui-dropdown2-active")}function s(a){return N&&N[0]===a[0]?!1:(N=a,r().removeClass("active aui-dropdown2-active"),o(a)&&a.addClass("active aui-dropdown2-active"),C.trigger("aui-dropdown2-item-selected"),A(),!0)}function t(){s(C.find("a:not(.disabled):not(.aui-dropdown2-disabled)").first())}function u(a){var b=C.find("> ul > li > a, > .aui-dropdown2-section > ul > li > a").not(".disabled,.aui-dropdown2-disabled");s(x(b,a,!0))}function v(a){a.length>0&&(m(),a.trigger("aui-button-invoke"))}function w(a){v(x(J.find(".aui-dropdown2-trigger").not(".disabled, .aui-dropdown2-disabled, [aria-disabled=true], .aui-dropdown2-sub-trigger"),a,!1))}function x(a,b,c){var d=a.index(a.filter(".active,.aui-dropdown2-active"));return d+=0>d&&0>b?1:0,d+=b,c?d%=a.length:0>d&&(d=a.length),a.eq(d)}function y(){v(a(this))}function z(){g===M&&(f.unbind(M),g=null)}function A(){g!==M&&(f.unbind(g),f.bind(M),g=M)}function B(a){var b="bind",c="delegate";"on"!==a&&(b="unbind",c="undelegate"),E?K[b]("aui-dropdown2-hide aui-dropdown2-item-selected aui-dropdown2-step-out",n):(J[c](".aui-dropdown2-trigger:not(.active):not(.aui-dropdown2-active)","mousemove",y),D[b]("aui-button-invoke",l)),C[b]("aui-dropdown2-hide-all",m),C[c]("a",L),C[b]("aui-dropdown2-hide",A),C[b]("aui-dropdown2-select-first",t)}i=a.extend({selectFirst:!0},i);var C=e(this),D=a(this).addClass("active aui-dropdown2-active"),E=D.hasClass("aui-dropdown2-sub-trigger"),F=C.parent()[0],G=C.next()[0],H=a(this).attr("data-dropdown2-hide-location");if(H){var I=document.getElementById(H);if(!I)throw new Error("The specified data-dropdown2-hide-location id doesn't exist");F=a(I),G=void 0}var J=i.$menu||D.closest(".aui-dropdown2-trigger-group");if(E){var K=D.closest(".aui-dropdown2");C.addClass(K.attr("class")).addClass("aui-dropdown2-sub-menu")}var L={click:function(c){var d=a(this);o(d)&&(d.hasClass("interactive")||d.hasClass("aui-dropdown2-interactive")||m(),p(d)&&(q(d,{selectFirst:!1}),b(c)))},mousemove:function(){var b=a(this),c=s(b);c&&q(b,{selectFirst:!1})}},M={"click focusin mousedown":function(a){var b=a.target;(document!==b||"focusin"!==a.type)&&(d(b,C[0])||d(b,D[0])||m())},keydown:function(a){var d;if(a.shiftKey&&9==a.keyCode)u(-1);else switch(a.keyCode){case 13:d=r(),p(d)?q(d):c(d[0]);break;case 27:l();break;case 37:if(d=r(),p(d)){var f=e(d);if(f.is(":visible"))return void C.trigger("aui-dropdown2-step-out")}E?l():w(-1);break;case 38:u(-1);break;case 39:d=r(),p(d)?q(d):w(1);break;case 40:u(1);break;case 9:u(1);break;default:return}b(a)}};D.attr("aria-controls",D.attr("aria-owns")),C.find(".disabled,.aui-dropdown2-disabled").attr("aria-disabled","true"),C.find("li.hidden > a,li.aui-dropdown2-hidden > a").addClass("disabled aui-dropdown2-disabled").attr("aria-disabled","true"),j(C.find(".aui-dropdown2-checkbox"),"checkbox"),j(C.find(".aui-dropdown2-radio"),"radio"),k(),D.hasClass("toolbar-trigger")&&C.addClass("aui-dropdown2-in-toolbar"),D.parent().hasClass("aui-buttons")&&C.addClass("aui-dropdown2-in-buttons"),D.parents().hasClass("aui-header")&&C.addClass("aui-dropdown2-in-header"),C.trigger("aui-dropdown2-show",i),i.selectFirst&&t(),B("on");var N=null},mousedown:function(b){1===b.which&&a(this).bind(j)}},j={mouseleave:function(){f.bind(k)},"mouseup mouseleave":function(){a(this).unbind(j)}},k={mouseup:function(b){var d=a(b.target).closest(".aui-dropdown2 a, .aui-dropdown2-trigger")[0];d&&setTimeout(function(){c(d)},0)},"mouseup mouseleave":function(){a(this).unbind(k)}};f.delegate(".aui-dropdown2-trigger",h),f.delegate(".aui-dropdown2-trigger:not(.active):not(.aui-dropdown2-active):not([aria-disabled=true]),.aui-dropdown2-sub-trigger:not([aria-disabled=true])",i),f.delegate(".aui-dropdown2-checkbox:not(.disabled):not(.aui-dropdown2-disabled)","click",function(){var b=a(this);b.hasClass("checked")||b.hasClass("aui-dropdown2-checked")?(b.removeClass("checked aui-dropdown2-checked").attr("aria-checked","false"),b.trigger("aui-dropdown2-item-uncheck")):(b.addClass("checked aui-dropdown2-checked").attr("aria-checked","true"),b.trigger("aui-dropdown2-item-check"))}),f.delegate(".aui-dropdown2-radio:not(.checked):not(.aui-dropdown2-checked):not(.disabled):not(.aui-dropdown2-disabled)","click",function(){var b=a(this),c=b.closest("ul").find(".checked,.aui-dropdown2-checked");c.removeClass("checked aui-dropdown2-checked").attr("aria-checked","false").trigger("aui-dropdown2-item-uncheck"),b.addClass("checked aui-dropdown2-checked").attr("aria-checked","true").trigger("aui-dropdown2-item-check")}),f.delegate(".aui-dropdown2 a.disabled,.aui-dropdown2 a.aui-dropdown2-disabled","click",function(a){b(a)})}(AJS.$),AJS.inlineHelp=function(){AJS.$(".icon-inline-help").click(function(){var a=AJS.$(this).siblings(".field-help");a.hasClass("hidden")?a.removeClass("hidden"):a.addClass("hidden")})},function(a){function b(b){var c=a(b),d=a.extend({left:0,top:0},c.offset());return{left:d.left,top:d.top,width:c.outerWidth(),height:c.outerHeight()}}function c(a,b,c,d){var e=AJS.$.isFunction(d.offsetX)?d.offsetX(a,b,c,d):d.offsetX,f=AJS.$.isFunction(d.offsetY)?d.offsetY(a,b,c,d):d.offsetY,g=AJS.$.isFunction(d.arrowOffsetX)?d.arrowOffsetX(a,b,c,d):d.arrowOffsetX,h=AJS.$.isFunction(d.arrowOffsetY)?d.arrowOffsetY(a,b,c,d):d.arrowOffsetY,i="body"!==d.container.toLowerCase(),j=AJS.$(d.container),k=i?AJS.$(d.container).parent():AJS.$(window),l=i?j.offset():{left:0,top:0},m=i?k.offset():{left:0,top:0},n=b.target,o=n.offset(),p=n[0].getBBox&&n[0].getBBox();return{screenPadding:10,arrowMargin:5,window:{top:m.top,left:m.left,scrollTop:k.scrollTop(),scrollLeft:k.scrollLeft(),width:k.width(),height:k.height()},scrollContainer:{width:j.width(),height:j.height()},trigger:{top:o.top-l.top,left:o.left-l.left,width:p?p.width:n.outerWidth(),height:p?p.height:n.outerHeight()},dialog:{width:a.width(),height:a.height(),offset:{top:f,left:e}},arrow:{height:a.find(".arrow").outerHeight(),offset:{top:h,left:g}}}}function d(a,b,d,e){var f=c(a,b,d,e),g=f.screenPadding,h=f.window,i=f.trigger,j=f.dialog,k=f.arrow,l=f.scrollContainer,m={top:i.top-h.scrollTop,left:i.left-h.scrollLeft},n=Math.floor(i.height/2),o=Math.floor(j.height/2),p=Math.floor(k.height/2),q=m.left-j.offset.left-g,r=l.width-m.left-i.width-j.offset.left-g,s=q>=j.width,t=r>=j.width,u=!t&&s?"e":"w",v=m.top+n-p,w=h.height-v-k.height;g=Math.min(g,v-f.arrowMargin),g=Math.min(g,w-f.arrowMargin);var x,y,z=m.top+n,A=Math.max(z-g,0),B=Math.max(h.height-z-g,0),C=o-j.offset.top>A,D=o+j.offset.top>B;return C?(x={top:h.scrollTop+g,left:"w"===u?i.left+i.width+j.offset.left:i.left-j.width-j.offset.left},y={top:i.top+n-(x.top+p)}):D?(x={top:h.scrollTop+h.height-j.height-g,left:"w"===u?i.left+i.width+j.offset.left:i.left-j.width-j.offset.left},y={top:i.top+n-(x.top+p)}):(x={top:i.top+n-o+j.offset.top,left:"w"===u?i.left+i.width+j.offset.left:i.left-j.width-j.offset.left},y={top:o-p+k.offset.top}),{gravity:u,popupCss:x,arrowCss:y}}function e(a,c,d,e){var f=AJS.$.isFunction(e.offsetX)?e.offsetX(a,c,d,e):e.offsetX,g=AJS.$.isFunction(e.offsetY)?e.offsetY(a,c,d,e):e.offsetY,h=AJS.$.isFunction(e.arrowOffsetX)?e.arrowOffsetX(a,c,d,e):e.arrowOffsetX,i=(AJS.$.isFunction(e.arrowOffsetY)?e.arrowOffsetY(a,c,d,e):e.arrowOffsetY,b(window)),j=b(c.target),k=b(a),l=b(a.find(".aui-inline-dialog-arrow")),m=j.left+j.width/2,n=(window.pageYOffset||document.documentElement.scrollTop)+i.height,o=10;k.top=j.top+j.height+~~g,k.left=j.left+~~f;var p=i.width-(k.left+k.width+o);l.left=m-k.left+~~h,l.top=-(l.height/2);var q=j.top>k.height,r=k.top+k.heightp?(k.right=o,k.left="auto",l.left=d.x-(i.width-k.width)):(k.left=d.x-20,l.left=d.x-k.left);else if(0>p){k.right=o,k.left="auto";var t=i.width-k.right,u=t-k.width;l.right="auto",l.left=m-u-l.width/2}else k.width<=j.width/2&&(l.left=k.width/2,k.left=m-k.width/2);return{gravity:s?"s":"n",displayAbove:s,popupCss:{left:k.left,top:k.top,right:k.right},arrowCss:{left:l.left,top:l.top,right:l.right}}}AJS.InlineDialog=function(b,c,d,e){if(e&&e.getArrowAttributes&&AJS.log("DEPRECATED: getArrowAttributes - See https://ecosystem.atlassian.net/browse/AUI-1362"),e&&e.getArrowPath&&(AJS.log("DEPRECATED: getArrowPath - See https://ecosystem.atlassian.net/browse/AUI-1362"),void 0!==e.gravity&&AJS.log("DEPRECATED: getArrowPath does not support gravity - See https://ecosystem.atlassian.net/browse/AUI-2197")),e&&void 0!==e.onTop&&(AJS.log("DEPRECATED: onTop has been replaced with gravity - See https://ecosystem.atlassian.net/browse/AUI-2197"),e.onTop&&void 0===e.gravity&&(e.gravity="s")),"undefined"==typeof c&&(c=String(Math.random()).replace(".",""),a("#inline-dialog-"+c+", #arrow-"+c+", #inline-dialog-shim-"+c).length))throw"GENERATED_IDENTIFIER_NOT_UNIQUE";var f=a.extend(!1,AJS.InlineDialog.opts,e);"w"===f.gravity&&(f.offsetX=void 0===e.offsetX?10:e.offsetX,f.offsetY=void 0===e.offsetY?0:e.offsetY);var g,h,i,j,k,l=function(){return window.Raphael&&e&&(e.getArrowPath||e.getArrowAttributes)},m=!1,n=!1,o=!1,p=a(''),q=a("#arrow-"+c,p),r=p.find(".contents");l()||p.find(".aui-inline-dialog-arrow").addClass("aui-css-arrow"),f.displayShadow||r.addClass("aui-inline-dialog-no-shadow"),f.autoWidth?r.addClass("aui-inline-dialog-auto-width"):r.css("width",f.width+"px"),r.mouseover(function(){clearTimeout(h),p.unbind("mouseover")}).mouseout(function(){u()});var s=function(){return g||(g={popup:p,hide:function(){u(0)},id:c,show:function(){t()},persistent:f.persistent?!0:!1,reset:function(){function b(b,d){if(b.css(d.popupCss),l()){"s"===d.gravity&&(d.arrowCss.top-=a.browser.msie?10:9),b.arrowCanvas||(b.arrowCanvas=Raphael("arrow-"+c,16,16));var e=f.getArrowPath,g=a.isFunction(e)?e(d):e;b.arrowCanvas.path(g).attr(f.getArrowAttributes())}else q.removeClass("aui-bottom-arrow aui-left-arrow aui-right-arrow"),"s"!==d.gravity||q.hasClass("aui-bottom-arrow")?"n"===d.gravity||("w"===d.gravity?q.addClass("aui-left-arrow"):"e"===d.gravity&&q.addClass("aui-right-arrow")):q.addClass("aui-bottom-arrow");q.css(d.arrowCss)}var d=AJS.$(window).height(),e=Math.round(.75*d);p.children(".aui-inline-dialog-contents").css("max-height",e);var g=f.calculatePositions(p,k,j,f);if(void 0!==g.displayAbove&&(AJS.log("DEPRECATED: displayAbove has been replaced with gravity - See https://ecosystem.atlassian.net/browse/AUI-2197"),g.gravity=g.displayAbove?"s":"n"),b(p,g),p.fadeIn(f.fadeTime,function(){}),a.browser.msie&&~~a.browser.version<10){var h=a("#inline-dialog-shim-"+c);h.length||a(p).prepend(a('')),h.css({width:r.outerWidth(),height:r.outerHeight()})}}}),g},t=function(){p.is(":visible")||(i=setTimeout(function(){o&&n&&(f.addActiveClass&&a(b).addClass("active"),m=!0,f.persistent||B(),AJS.InlineDialog.current=s(),a(document).trigger("showLayer",["inlineDialog",s()]),s().reset())},f.showDelay))},u=function(c){"undefined"==typeof c&&f.persistent||(n=!1,m&&f.preHideCallback.call(p[0].popup)&&(c=null==c?f.hideDelay:c,clearTimeout(h),clearTimeout(i),null!=c&&(h=setTimeout(function(){C(),f.addActiveClass&&a(b).removeClass("active"),p.fadeOut(f.fadeTime,function(){f.hideCallback.call(p[0].popup)}),p.arrowCanvas&&(p.arrowCanvas.remove(),p.arrowCanvas=null),m=!1,n=!1,a(document).trigger("hideLayer",["inlineDialog",s()]),AJS.InlineDialog.current=null,f.cacheContent||(o=!1,w=!1)},c))))},v=function(b,e){var g=a(e);f.upfrontCallback.call({popup:p,hide:function(){u(0)},id:c,show:function(){t()}}),p.each(function(){"undefined"!=typeof this.popup&&this.popup.hide()}),f.closeOthers&&a(".aui-inline-dialog").each(function(){!this.popup.persistent&&this.popup.hide()}),k={target:g},j=b?{x:b.pageX,y:b.pageY}:{x:g.offset().left,y:g.offset().top},m||clearTimeout(i),n=!0;var l=function(){w=!1,o=!0,f.initCallback.call({popup:p,hide:function(){u(0)},id:c,show:function(){t()}}),t()};return w||(w=!0,a.isFunction(d)?d(r,e,l):a.get(d,function(a,b,d){r.html(f.responseHandler(a,b,d)),o=!0,f.initCallback.call({popup:p,hide:function(){u(0)},id:c,show:function(){t()}}),t()})),clearTimeout(h),m||t(),!1};p[0].popup=s();var w=!1,x=!1,y=function(){x||(a(f.container).append(p),x=!0)},z=a(b);f.onHover?f.useLiveEvents?z.selector?a(document).on("mousemove",z.selector,function(a){y(),v(a,this)}).on("mouseout",z.selector,function(){u()}):AJS.log("Warning: inline dialog trigger elements must have a jQuery selector when the useLiveEvents option is enabled."):z.mousemove(function(a){y(),v(a,this)}).mouseout(function(){u()}):f.noBind||(f.useLiveEvents?z.selector?a(document).on("click",z.selector,function(a){return y(),A()?p.hide():v(a,this),!1}).on("mouseout",z.selector,function(){u()}):AJS.log("Warning: inline dialog trigger elements must have a jQuery selector when the useLiveEvents option is enabled."):z.click(function(a){return y(),A()?p.hide():v(a,this),!1}).mouseout(function(){u()}));var A=function(){return m&&f.closeOnTriggerClick},B=function(){F(),I()},C=function(){G(),J()},D=!1,E=c+".inline-dialog-check",F=function(){D||(a("body").bind("click."+E,function(b){var d=a(b.target);0===d.closest("#inline-dialog-"+c+" .contents").length&&u(0)}),D=!0)},G=function(){D&&a("body").unbind("click."+E),D=!1},H=function(a){27===a.keyCode&&u(0)},I=function(){a(document).on("keydown",H)},J=function(){a(document).off("keydown",H)};return p.show=function(a,c){a&&a.stopPropagation(),y(),!f.noBind||b&&b.length?v(a,b):v(a,void 0===c?a.target:c)},p.hide=function(){u(0)},p.refresh=function(){m&&s().reset()},p.getOptions=function(){return f},p},AJS.InlineDialog.opts={onTop:!1,responseHandler:function(a){return a},closeOthers:!0,isRelativeToMouse:!1,addActiveClass:!0,onHover:!1,useLiveEvents:!1,noBind:!1,fadeTime:100,persistent:!1,hideDelay:1e4,showDelay:0,width:300,offsetX:0,offsetY:10,arrowOffsetX:0,arrowOffsetY:0,container:"body",cacheContent:!0,displayShadow:!0,autoWidth:!1,gravity:"n",closeOnTriggerClick:!1,preHideCallback:function(){return!0},hideCallback:function(){},initCallback:function(){},upfrontCallback:function(){},calculatePositions:function(a,b,c,f){f=f||{};var g="w"===f.gravity?d:e;return g(a,b,c,f)},getArrowPath:function(a){return"s"===a.gravity?"M0,8L8,16,16,8":"M0,8L8,0,16,8"},getArrowAttributes:function(){return{fill:"#fff",stroke:"#ccc"}}}}(AJS.$),AJS.template=function(a){var b=/\{([^\}]+)\}/g,c=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,d=/([^\\])'/g,e=function(a,b,d,e){var f=d;return b.replace(c,function(a,b,c,d,g){b=b||d,f&&(b+":html"in f?(f=f[b+":html"],e=!0):b in f&&(f=f[b]),g&&"function"==typeof f&&(f=f()))}),(null==f||f==d)&&(f=a),f=String(f),e||(f=i.escape(f)),f},f=function(a){return this.template=this.template.replace(b,function(b,c){return e(b,c,a,!0)}),this},g=function(a){return this.template=this.template.replace(b,function(b,c){return e(b,c,a)}),this},h=function(){return this.template},i=function(a){function b(){return b.template}return b.template=String(a),b.toString=b.valueOf=h,b.fill=g,b.fillHtml=f,b},j={},k=[];return i.load=function(b){return b=String(b),j.hasOwnProperty(b)||(k.length>=1e3&&delete j[k.shift()],k.push(b),j[b]=a("script[title='"+b.replace(d,"$1\\'")+"']")[0].text),this(j[b])},i.escape=AJS.escapeHtml,i}(AJS.$),function(){var a=500,b=5e3,c=100;AJS.messages={setup:function(){AJS.messages.createMessage("generic"),AJS.messages.createMessage("error"),AJS.messages.createMessage("warning"),AJS.messages.createMessage("info"),AJS.messages.createMessage("success"),AJS.messages.createMessage("hint"),AJS.messages.makeCloseable(),AJS.messages.makeFadeout()},makeCloseable:function(a){AJS.$(a||"div.aui-message.closeable").each(function(){var a=AJS.$(this),b=AJS.$(' ').click(function(){a.closeMessage()}).keypress(function(b){(b.which===AJS.keyCode.ENTER||b.which===AJS.keyCode.SPACE)&&(a.closeMessage(),b.preventDefault())});a.append(b)})},makeFadeout:function(d,e,f){e="undefined"!=typeof e?e:b,f="undefined"!=typeof f?f:a,AJS.$(d||"div.aui-message.fadeout").each(function(){function a(){g.stop(!0,!1).delay(e).fadeOut(f,function(){g.closeMessage()})}function b(){g.stop(!0,!1).fadeTo(c,1)}function d(){return!h&&!i}var g=AJS.$(this),h=!1,i=!1;g.focusin(function(){h=!0,b()}).focusout(function(){h=!1,d()&&a()}).hover(function(){i=!0,b()},function(){i=!1,d()&&a()}),a()})},template:'',createMessage:function(a){AJS.messages[a]=function(b,c){var d,e,f=this.template;return c||(c=b,b="#aui-message-bar"),c.closeable=c.closeable!==!1,c.shadowed=c.shadowed!==!1,d=AJS.$(AJS.template(f).fill({type:"aui-message-"+a+" "+a,closeable:c.closeable?"closeable":"",shadowed:c.shadowed?"shadowed":"",fadeout:c.fadeout?"fadeout":"",title:c.title||"","body:html":c.body||""}).toString()),c.id&&(/[#\'\"\.\s]/g.test(c.id)?AJS.log("AJS.Messages error: ID rejected, must not include spaces, hashes, dots or quotes."):d.attr("id",c.id)),e=c.insert||"append","prepend"===e?d.prependTo(b):d.appendTo(b),c.closeable&&AJS.messages.makeCloseable(d),c.fadeout&&AJS.messages.makeFadeout(d,c.delay,c.duration),d}}},AJS.$.fn.closeMessage=function(){var a=AJS.$(this);a.hasClass("aui-message","closeable")&&(a.stop(!0),a.trigger("messageClose",[this]).remove(),AJS.$(document).trigger("aui-message-close",[this]))},AJS.$(function(){AJS.messages.setup()})}(),function(a){"use strict";function b(){var b=a(this);AJS._addID(b),b.attr("role","tab");var c=b.attr("href");a(c).attr("aria-labelledby",b.attr("id")),b.parent().hasClass(k)?b.attr(m,"true"):b.attr(m,"false")}function c(b,c){var d=a(b),e=d.parent(),f=d.find(".tabs-menu").first(),g=f.find("li:not(.aui-tabs-responsive-trigger-item)"),h=f.find(".aui-tabs-responsive-trigger").parent(),j=h.find("a"),k=j.attr("aria-owns"),l=a(document).find("#"+k).attr("aria-checked",!1),m=l.length>0,n=r.totalTabsWidth(g,l),o=n>e.outerWidth();if(!m&&o&&(h=r.createResponsiveDropdownTrigger(f,c),l=r.createResponsiveDropdown(d,c)),j.attr("aria-owns","aui-tabs-responsive-dropdown-"+c),j.attr("id","aui-tabs-responsive-trigger-"+c),j.attr("href","aui-tabs-responsive-trigger-"+c),l.attr("id","aui-tabs-responsive-dropdown-"+c),o){var p=r.processVisibleTabs(g.toArray(),e,h),q=r.totalVisibleTabWidth(p),s=e.outerWidth()-q-h.outerWidth(!0),t=s>0;if(t){var u=l.find("li");r.processInvisibleTabs(u.toArray(),s,h)}l.on("click","a",i)}m&&!o&&(l.find("li").each(function(){r.moveTabOutOfDropdown(a(this),h)}),r.removeResponsiveDropdown(l,h))}function d(b){if(!b.hasClass("aui-tabs-responsive-trigger")){var c=a(b.attr("href").match(j)[0]);c.addClass(l).attr(n,"false").siblings(".tabs-pane").removeClass(l).attr(n,"true");var d=b.parents(".aui-tabs").find(".aui-tabs-responsive-trigger-item a"),e=d.attr("aria-owns"),f=a(document).find("#"+e);f.find("li a").attr("aria-checked",!1).removeClass("checked aui-dropdown2-checked"),f.find("li").removeClass("active-tab")}if(b.parent("li.menu-item").addClass(k).siblings(".menu-item").removeClass(k),b.hasClass("aui-tabs-responsive-item")){var g=c.parent(".aui-tabs").find("li.menu-item:not(.aui-tabs-responsive-trigger-item)");g.removeClass(k),g.find("a").removeClass("checked").removeAttr("aria-checked")}b.closest(".tabs-menu").find("a").attr(m,"false"),b.attr(m,"true"),b.trigger("tabSelect",{tab:b,pane:c})}function e(a){return void 0!==a.attr(o)&&"false"!==a.attr(o)}function f(a){var b=a.attr("id"),c=a.attr(o);return p+(b?b:"")+(c&&"true"!==c?"-"+c:"")}function g(a){for(var b=0,c=a.length;c>b;b++){var g=a.eq(b);if(e(g)&&window.localStorage){var h=g.attr("id");if(h){var i=window.localStorage.getItem(f(g));if(i){var j=g.find("#"+i);j.length&&d(j)}}else AJS.warn("A tab group must specify an id attribute if it specifies data-aui-persist")}}}function h(a){var b=a.closest(".aui-tabs"),c=b.attr("id");if(c){var d=a.attr("id");d&&window.localStorage.setItem(f(b),d)}else AJS.warn("A tab group must specify an id attribute if it specifies data-aui-persist")}function i(b){AJS.tabs.change(a(this),b),b&&b.preventDefault()}var j=/#.*/,k="active-tab",l="active-pane",m="aria-selected",n="aria-hidden",o="data-aui-persist",p="_internal-aui-tabs-",q=".aui-tabs.horizontal-tabs[data-aui-responsive]:not([data-aui-responsive='false'])",r={totalTabsWidth:function(a,b){var c=this.totalVisibleTabWidth(a),d=0;return b.find("li").each(function(a,b){d+=parseInt(b.getAttribute("data-aui-tab-width"))}),c+d},totalVisibleTabWidth:function(b){var c=0;return b.each(function(b,d){c+=a(d).outerWidth()}),c},removeResponsiveDropdown:function(a,b){a.remove(),b.remove()},createResponsiveDropdownTrigger:function(a,b){var c='';a.append(c);var d=a.find(".aui-tabs-responsive-trigger-item");return d},createResponsiveDropdown:function(a,b){var c='';a.append(c);var d=a.find("#aui-tabs-responsive-dropdown-"+b);return d},findNewVisibleTabs:function(b,c,d){function e(a,b,c){return c>=a+b}for(var f=0,g=0;e(f,d,c)&&g=h;i--){var j=a(b[i]);this.moveTabToResponsiveDropdown(j,f,d)}return a(g)},moveTabToResponsiveDropdown:function(a,b,c){var d=a.find("a");a.attr("data-aui-tab-width",a.outerWidth(!0)),d.addClass("aui-dropdown2-radio aui-tabs-responsive-item"),a.hasClass("active-tab")&&(d.addClass("aui-dropdown2-checked"),c.addClass("active-tab")),b.find("ul").prepend(a)
+},processInvisibleTabs:function(b,c,d){function e(a){return a>0}for(var f=0;e(c)&&fh;i&&this.moveTabOutOfDropdown(g,d),c-=h}},moveTabOutOfDropdown:function(a,b){var c=a.find("a").hasClass("aui-dropdown2-checked");c&&(a.addClass("active-tab"),b.removeClass("active-tab")),a.children("a").removeClass("aui-dropdown2-radio aui-tabs-responsive-item aui-dropdown2-checked"),b.before(a)}};AJS.tabs={setup:function(){function d(a){a.forEach(function(a){c(a,j)})}var e=a(".aui-tabs:not(.aui-tabs-disabled)"),f=a(q).toArray();d(f);var h=AJS.debounce(d,200);a(window).resize(function(){h(f)}),e.attr("role","application"),e.find(".tabs-pane").each(function(){var b=a(this);b.attr("role","tabpanel"),b.hasClass(l)?b.attr(n,"false"):b.attr(n,"true")});for(var j=0,k=e.length;k>j;j++){var m=e.eq(j);if(!m.data("aui-tab-events-bound")){var o=m.children("ul.tabs-menu");o.attr("role","tablist"),o.children("li").attr("role","presentation"),o.find("> .menu-item a").each(b),o.delegate("a","click",i),m.data("aui-tab-events-bound",!0)}}g(e),a(".aui-tabs.vertical-tabs").find("a").each(function(){var b=a(this);b.attr("title")||AJS.isClipped(b)&&b.attr("title",b.text())})},change:function(a){d(a);var b=a.closest(".aui-tabs");e(b)&&window.localStorage&&h(a)}},a(AJS.tabs.setup)}(AJS.$),function(){var _after=1,_afterThrow=2,_afterFinally=3,_before=4,_around=5,_intro=6,_regexEnabled=!0,_arguments="arguments",_undef="undefined",getType=function(){for(var a=Object.prototype.toString,b={},c={1:"element",3:"textnode",9:"document",11:"fragment"},d="Arguments Array Boolean Date Document Element Error Fragment Function NodeList Null Number Object RegExp String TextNode Undefined Window".split(" "),e=d.length;e--;){var f=d[e],g=window[f];if(g)try{b[a.call(new g)]=f.toLowerCase()}catch(h){}}return function(d){return null==d&&(void 0===d?_undef:"null")||d.nodeType&&c[d.nodeType]||"number"==typeof d.length&&(d.callee&&_arguments||d.alert&&"window"||d.item&&"nodelist")||b[a.call(d)]}}(),isFunc=function(a){return"function"==getType(a)},weaveOne=function(source,method,advice){var old=source[method];if(advice.type!=_intro&&!isFunc(old)){var oldObject=old;old=function(){for(var code=arguments.length>0?_arguments+"[0]":"",i=1;ih;h++){for(var j=AJS("ol"),k=0,l=a[h].length;l>k;k++){var m=AJS("li"),n=a[h][k];n.href?(m.append(AJS("a").html(""+g.displayHandler(n)+" ").attr({href:n.href}).addClass(n.className)),AJS.$.data(AJS.$("a > span",m)[0],"properties",n)):m.html(n.html).addClass(n.className),n.icon&&m.prepend(AJS("img").attr("src",n.icon)),n.insideSpanIcon&&m.children("a").prepend(AJS("span").attr("class","icon")),AJS.$.data(m[0],"properties",n),j.append(m)}h==i-1&&j.addClass("last"),c.append(j)}AJS.$("body").append(c)}var o=function(){q(1)},p=function(){q(-1)},q=function(a){var b=!e,c=AJS.dropDown.current.$[0],d=AJS.dropDown.current.links,f=c.focused;if(e=!0,0!==d.length){if(c.focused="number"==typeof f?f:-1,!AJS.dropDown.current)return AJS.log("move - not current, aborting"),!0;c.focused+=a,c.focused<0?c.focused=d.length-1:c.focused>=d.length&&(c.focused=0),g.moveHandler(AJS.$(d[c.focused]),0>a?"up":"down"),b&&d.length?(AJS.$(d[c.focused]).addClass(g.activeClass),e=!1):d.length||(e=!1)}},r=function(a){if(!AJS.dropDown.current)return!0;var b=a.which,c=AJS.dropDown.current.$[0],d=AJS.dropDown.current.links;switch(AJS.dropDown.current.cleanActive(),b){case 40:o();break;case 38:p();break;case 27:return g.escapeHandler.call(AJS.dropDown.current,a);case 13:return c.focused>=0?g.selectionHandler?g.selectionHandler.call(AJS.dropDown.current,a,AJS.$(d[c.focused])):"a"!=AJS.$(d[c.focused]).attr("nodeName")?AJS.$("a",d[c.focused]).trigger("focus"):AJS.$(d[c.focused]).trigger("focus"):!0;default:return d.length&&AJS.$(d[c.focused]).addClass(g.activeClass),!0}return a.stopPropagation(),a.preventDefault(),!1},s=function(a){a&&a.which&&3==a.which||a&&a.button&&2==a.button||AJS.dropDown.current&&AJS.dropDown.current.hide("click")},t=function(a){return function(){AJS.dropDown.current&&(AJS.dropDown.current.cleanFocus(),this.originalClass=this.className,AJS.$(this).addClass(g.activeClass),AJS.dropDown.current.$[0].focused=a)}},u=function(a){return a.button||a.metaKey||a.ctrlKey||a.shiftKey?!0:void(AJS.dropDown.current&&g.selectionHandler&&g.selectionHandler.call(AJS.dropDown.current,a,AJS.$(this)))},v=function(a){var b=!1;return a.data("events")&&AJS.$.each(a.data("events"),function(a,c){AJS.$.each(c,function(a,c){return u===c?(b=!0,!1):void 0})}),b};return c.each(function(){var a=this,b=AJS.$(this),c={},e={reset:function(){c=AJS.$.extend(c,{$:b,links:AJS.$(g.item||"li:has(a)",a),cleanActive:function(){a.focused+1&&c.links.length&&AJS.$(c.links[a.focused]).removeClass(g.activeClass)},cleanFocus:function(){c.cleanActive(),a.focused=-1},moveDown:o,moveUp:p,moveFocus:r,getFocusIndex:function(){return"number"==typeof a.focused?a.focused:-1}}),c.links.each(function(a){var b=AJS.$(this);v(b)||(b.hover(t(a),c.cleanFocus),b.click(u))})},appear:function(a){a?(b.removeClass("hidden"),b.addClass("aui-dropdown-"+g.alignment)):b.addClass("hidden")},fade:function(a){a?b.fadeIn("fast"):b.fadeOut("fast")},scroll:function(a){a?b.slideDown("fast"):b.slideUp("fast")}};c.reset=e.reset,c.reset(),c.addControlProcess=function(a,b){AJS.$.aop.around({target:this,method:a},b)},c.addCallback=function(a,b){return AJS.$.aop.after({target:this,method:a},b)},c.show=function(b){g.useDisabled&&this.$.closest(".aui-dd-parent").hasClass("disabled")||(this.alignment=g.alignment,s(),AJS.dropDown.current=this,this.method=b||this.method||"appear",this.timer=setTimeout(function(){f.click(s)},0),f.keydown(r),g.firstSelected&&this.links[0]&&t(0).call(this.links[0]),AJS.$(a.offsetParent).css({zIndex:2e3}),e[this.method](!0),AJS.$(document).trigger("showLayer",["dropdown",AJS.dropDown.current]))},c.hide=function(a){return this.method=this.method||"appear",AJS.$(b.get(0).offsetParent).css({zIndex:""}),this.cleanFocus(),e[this.method](!1),f.unbind("click",s).unbind("keydown",r),AJS.$(document).trigger("hideLayer",["dropdown",AJS.dropDown.current]),AJS.dropDown.current=null,a},c.addCallback("reset",function(){g.firstSelected&&this.links[0]&&t(0).call(this.links[0])}),AJS.dropDown.iframes||(AJS.dropDown.iframes=[]),AJS.dropDown.createShims=function(){return AJS.$("iframe").each(function(){var a=this;a.shim||(a.shim=AJS.$("
").addClass("shim hidden").appendTo("body"),AJS.dropDown.iframes.push(a))}),arguments.callee}(),c.addCallback("show",function(){AJS.$(AJS.dropDown.iframes).each(function(){var a=AJS.$(this);if(a.is(":visible")){var b=a.offset();b.height=a.height(),b.width=a.width(),this.shim.css({left:b.left+"px",top:b.top+"px",height:b.height+"px",width:b.width+"px"}).removeClass("hidden")}})}),c.addCallback("hide",function(){AJS.$(AJS.dropDown.iframes).each(function(){this.shim.addClass("hidden")}),g.hideHandler()}),d.push(c)}),d},AJS.dropDown.getAdditionalPropertyValue=function(a,b){var c=a[0];c&&"string"==typeof c.tagName&&"li"==c.tagName.toLowerCase()||AJS.log("AJS.dropDown.getAdditionalPropertyValue : item passed in should be an LI element wrapped by jQuery");var d=AJS.$.data(c,"properties");return d?d[b]:null},AJS.dropDown.removeAllAdditionalProperties=function(){},AJS.dropDown.Standard=function(a){var b,c=[],d={selector:".aui-dd-parent",dropDown:".aui-dropdown",trigger:".aui-dd-trigger"};AJS.$.extend(d,a);var e=function(a,b,c,e){AJS.$.extend(e,{trigger:a}),b.addClass("dd-allocated"),c.addClass("hidden"),0==d.isHiddenByDefault&&e.show(),e.addCallback("show",function(){b.addClass("active")}),e.addCallback("hide",function(){b.removeClass("active")})},f=function(a,b,c,d){d!=AJS.dropDown.current&&(c.css({top:b.outerHeight()}),d.show(),a.stopImmediatePropagation()),a.preventDefault()};if(d.useLiveEvents){var g=[],h=[];AJS.$(d.trigger).live("click",function(a){var b,c,i,j,k=AJS.$(this);if((j=AJS.$.inArray(this,g))>=0){var l=h[j];b=l.parent,c=l.dropdown,i=l.ddcontrol}else{if(b=k.closest(d.selector),c=b.find(d.dropDown),0===c.length)return;if(i=AJS.dropDown(c,d)[0],!i)return;g.push(this),l={parent:b,dropdown:c,ddcontrol:i},e(k,b,c,i),h.push(l)}f(a,k,c,i)})}else b=this instanceof AJS.$?this:AJS.$(d.selector),b=b.not(".dd-allocated").filter(":has("+d.dropDown+")").filter(":has("+d.trigger+")"),b.each(function(){var a=AJS.$(this),b=AJS.$(d.dropDown,this),g=AJS.$(d.trigger,this),h=AJS.dropDown(b,d)[0];AJS.$.extend(h,{trigger:g}),e(g,a,b,h),g.click(function(a){f(a,g,b,h)}),c.push(h)});return c},AJS.dropDown.Ajax=function(a){var b,c={cache:!0};return AJS.$.extend(c,a||{}),b=AJS.dropDown.Standard.call(this,c),AJS.$(b).each(function(){var a=this;AJS.$.extend(a,{getAjaxOptions:function(b){var d=function(b){c.formatResults&&(b=c.formatResults(b)),c.cache&&a.cache.set(a.getAjaxOptions(),b),a.refreshSuccess(b)};return c.ajaxOptions?AJS.$.isFunction(c.ajaxOptions)?AJS.$.extend(c.ajaxOptions.call(a),{success:d}):AJS.$.extend(c.ajaxOptions,{success:d}):AJS.$.extend(b,{success:d})},refreshSuccess:function(a){this.$.html(a)},cache:function(){var a={};return{get:function(b){var c=b.data||"";return a[(b.url+c).replace(/[\?\&]/gi,"")]},set:function(b,c){var d=b.data||"";a[(b.url+d).replace(/[\?\&]/gi,"")]=c},reset:function(){a={}}}}(),show:function(b){return function(){c.cache&&a.cache.get(a.getAjaxOptions())?(a.refreshSuccess(a.cache.get(a.getAjaxOptions())),b.call(a)):(AJS.$(AJS.$.ajax(a.getAjaxOptions())).throbber({target:a.$,end:function(){a.reset()}}),b.call(a),a.iframeShim&&a.iframeShim.hide())}}(a.show),resetCache:function(){a.cache.reset()}}),a.addCallback("refreshSuccess",function(){a.reset()})}),b},AJS.$.fn.dropDown=function(a,b){return a=(a||"Standard").replace(/^([a-z])/,function(a){return a.toUpperCase()}),AJS.dropDown[a].call(this,b)},function(a){function b(a){this.num=0,this.timer=a>0?a:!1}function c(c){if(a.isPlainObject(c.data)||a.isArray(c.data)||"string"==typeof c.data){var e=c.handler,f={timer:700};!function(b){"string"==typeof b?f.combo=[b]:a.isArray(b)?f.combo=b:a.extend(f,b),f.combo=a.map(f.combo,function(a){return a.toLowerCase()})}(c.data),c.index=new b(f.timer),c.handler=function(b){if(this===b.target||!/textarea|select|input/i.test(b.target.nodeName)){var g="keypress"!==b.type?a.hotkeys.specialKeys[b.which]:null,h=String.fromCharCode(b.which).toLowerCase(),i="",j={};b.altKey&&"alt"!==g&&(i+="alt+"),b.ctrlKey&&"ctrl"!==g&&(i+="ctrl+"),b.metaKey&&!b.ctrlKey&&"meta"!==g&&(i+="meta+"),b.shiftKey&&"shift"!==g&&(i+="shift+"),b.metaKey&&"["===h&&(h=null),g&&(j[i+g]=!0),h&&(j[i+h]=!0),/shift+/.test(i)&&(j[i.replace("shift+","")+a.hotkeys.shiftNums[g||h]]=!0);var k=c.index,l=f.combo;if(d(l[k.val()],j)){if(k.val()===l.length-1)return k.reset(),e.apply(this,arguments);k.inc()}else k.reset(),d(l[0],j)&&k.inc()}}}}function d(a,b){for(var c=a.split(" "),d=0,e=c.length;e>d;d++)if(b[c[d]])return!0;return!1}a.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",91:"meta",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",188:",",190:".",191:"/",224:"meta",219:"[",221:"]"},keypressKeys:["<",">","?"],shiftNums:{"`":"~",1:"!",2:"@",3:"#",4:"$",5:"%",6:"^",7:"&",8:"*",9:"(",0:")","-":"_","=":"+",";":":","'":'"',",":"<",".":">","/":"?","\\":"|"}},a.each(a.hotkeys.keypressKeys,function(b,c){a.hotkeys.shiftNums[c]=c}),b.prototype.val=function(){return this.num},b.prototype.inc=function(){this.timer&&(clearTimeout(this.timeout),this.timeout=setTimeout(a.proxy(b.prototype.reset,this),this.timer)),this.num++},b.prototype.reset=function(){this.timer&&clearTimeout(this.timeout),this.num=0},a.each(["keydown","keyup","keypress"],function(){a.event.special[this]={add:c}})}(jQuery),function(a,b){var c=-1!==navigator.platform.indexOf("Mac"),d=/^(backspace|tab|r(ight|eturn)|s(hift|pace|croll)|c(trl|apslock)|alt|pa(use|ge(up|down))|e(sc|nd)|home|left|up|d(el|own)|insert|f\d\d?|numlock|meta)/i;a.whenIType=function(e){function f(a){!AJS.popup.current&&p&&p.fire(a)}function g(a){a.preventDefault()}function h(a){var c=a&&a.split?b.trim(a).split(" "):[a];c.forEach(function(a){j(a)})}function i(a){for(var b=a.length;b--;)if(a[b].length>1&&"space"!==a[b])return!0;return!1}function j(a){var c=a instanceof Array?a:k(a.toString()),d=i(c)?"keydown":"keypress";o.push(c),b(document).bind(d,c,f),b(document).bind(d+" keyup",c,g)}function k(a){for(var b,c,e=[],f="";a.length;)(b=a.match(/^(ctrl|meta|shift|alt)\+/i))?(f+=b[0],a=a.substring(b[0].length)):(c=a.match(d))?(e.push(f+c[0]),a=a.substring(c[0].length),f=""):(e.push(f+a[0]),a=a.substring(1),f="");return e}function l(a){for(var d=b(a),e=d.attr("title")||"",f=o.slice(),g=d.data("kbShortcutAppended")||"",h=!g,i=h?e:e.substring(0,e.length-g.length);f.length;)g=n(f.shift().slice(),g,h),h=!1;c&&(g=g.replace(/Meta/gi,"\u2318").replace(/Shift/gi,"\u21e7")),d.attr("title",i+g),d.data("kbShortcutAppended",g)}function m(a){var c=b(a),d=c.data("kbShortcutAppended");if(d){var e=c.attr("title");c.attr("title",e.replace(d,"")),c.removeData("kbShortcutAppended")}}function n(a,b,c){return c?b+=" ("+AJS.I18n.getText("aui.keyboard.shortcut.type.x",a.shift()):(b=b.replace(/\)$/,""),b+=AJS.I18n.getText("aui.keyboard.shortcut.or.x",a.shift())),a.forEach(function(a){b+=" "+AJS.I18n.getText("aui.keyboard.shortcut.then.x",a)}),b+=")"}var o=[],p=b.Callbacks();return h(e),a.whenIType.makeShortcut({executor:p,bindKeys:h,addShortcutsToTitle:l,removeShortcutsFromTitle:m,keypressHandler:f,defaultPreventionHandler:g})},a.whenIType.makeShortcut=function(a){function c(a){return function(c,e){e=e||{};var f=e.focusedClass||"focused",g=e.hasOwnProperty("wrapAround")?e.wrapAround:!0,h=e.hasOwnProperty("escToCancel")?e.escToCancel:!0;return d.add(function(){var d=b(c),e=d.filter("."+f),i=0===e.length?void 0:{transition:!0};h&&b(document).one("keydown",function(a){a.keyCode===AJS.keyCode.ESCAPE&&e&&e.removeClass(f)}),e.length&&e.removeClass(f),e=a(e,d,g),e&&e.length>0&&(e.addClass(f),e.moveTo(i),e.is("a")?e.focus():e.find("a:first").focus())}),this}}var d=a.executor,e=a.bindKeys,f=a.addShortcutsToTitle,g=a.removeShortcutsFromTitle,h=a.keypressHandler,i=a.defaultPreventionHandler,j=[];return{moveToNextItem:c(function(a,c,d){var e;return d&&0===a.length?c.eq(0):(e=b.inArray(a.get(0),c),e0?(e-=1,c.eq(e)):d?c.filter(":last"):a)}),click:function(a){return j.push(a),f(a),d.add(function(){var c=b(a);c.length>0&&c.click()}),this},goTo:function(a){return d.add(function(){window.location.href=a}),this},followLink:function(a){return j.push(a),f(a),d.add(function(){var c=b(a)[0];c&&{a:!0,link:!0}[c.nodeName.toLowerCase()]&&(window.location.href=c.href)}),this},execute:function(a){var b=this;return d.add(function(){a.apply(b,arguments)}),this},evaluate:function(a){a.call(this)},moveToAndClick:function(a){return j.push(a),f(a),d.add(function(){var c=b(a);c.length>0&&(c.click(),c.moveTo())}),this},moveToAndFocus:function(a){return j.push(a),f(a),d.add(function(b){var c=AJS.$(a);c.length>0&&(c.focus(),c.moveTo&&c.moveTo(),c.is(":input")&&b.preventDefault())}),this},or:function(a){return e(a),this},unbind:function(){b(document).unbind("keydown keypress",h).unbind("keydown keypress keyup",i);for(var a=0,c=j.length;c>a;a++)g(j[a]);j=[]}}},a.whenIType.fromJSON=function(a,d){var e=[];return a&&b.each(a,function(a,f){var g,h=f.op,i=f.param;if("execute"===h||"evaluate"===h)g=[new Function(i)];else if(/^\[[^\]\[]*,[^\]\[]*\]$/.test(i)){try{g=JSON.parse(i)}catch(j){AJS.error("When using a parameter array, array must be in strict JSON format: "+i)}b.isArray(g)||AJS.error("Badly formatted shortcut parameter. String or JSON Array of parameters required: "+i)}else g=[i];f.keys.forEach(function(a){d&&c&&(a=b.map(a,function(a){return a.replace(/ctrl/i,"meta")}));var f=AJS.whenIType(a);f[h].apply(f,g),e.push(f)})}),e},b(document).bind("iframeAppended",function(a,c){b(c).load(function(){var a=b(c).contents();a.bind("keyup keydown keypress",function(a){b.browser.safari&&"keypress"===a.type||b(a.target).is(":input")||b.event.trigger(a,arguments,document,!0)})})})}(AJS,AJS.$),function(a){AJS.responsiveheader={},AJS.responsiveheader.setup=function(){function b(b,c){function d(a){var b;if(e(),!(n>o)){k.show(),b=n-q;for(var c=0;b>=0;c++)b-=m[c].itemWidth;return c-=1,h(c,a),g(c,l,a),c}i(a)}function e(){var b=0!==j.length?j.offset().left:a(window).width(),c=p.offset().left+p.outerWidth(!0)+s;n=b-c}function f(b){var c=a(""+aui.dropdown2.trigger({menu:{id:"aui-responsive-header-dropdown-content-"+b},text:AJS.I18n.getText("aui.words.more"),extraAttributes:{href:"#"},id:"aui-responsive-header-dropdown-trigger-"+b})+" ");c.append(aui.dropdown2.contents({id:"aui-responsive-header-dropdown-content-"+b,extraClasses:"aui-style-default",content:aui.dropdown2.section({content:""})})),0===s?c.appendTo(r(".aui-nav")):c.insertBefore(r(".aui-nav > li > .aui-button").first().parent()),k=c,q=k.outerWidth(!0)}function g(b,c,d){if(!(0>b||0>c||b===c)){var e,f,g=a("#aui-responsive-header-dropdown-trigger-"+d),h=g.parent();g.hasClass("active")&&g.trigger("aui-button-invoke");for(var i=r(".aui-nav > li > a:not(.aui-button):not(#aui-responsive-header-dropdown-trigger-"+d+")").length;b>c;)e=m[c],e&&e.itemElement&&(f=e.itemElement,0===i?f.prependTo(r(".aui-nav")):f.insertBefore(h),f.children("a").removeClass("aui-dropdown2-sub-trigger active"),c+=1,i+=1)}}function h(b,c){if(!(0>b))for(var d=a("#aui-responsive-header-dropdown-list-"+c),e=b;e li > a:not(.aui-button)").each(function(b,c){var d=a(c).parent(),e=d.outerWidth(!0);m.push({itemElement:d,itemWidth:e}),o+=e}),l=m.length,a(window).resize(function(){l=d(c)}),f(c);var t=p.find("img");0!==t.length&&(t.attr("data-aui-responsive-header-index",c),t.load(function(){l=d(c)})),l=d(c),r(".aui-nav").css("width","auto")}var c=a(".aui-header");c.length&&c.each(function(c,d){b(a(d),c)})}}(AJS.$),AJS.$(AJS.responsiveheader.setup),function(a){"function"==typeof define&&define.amd?define("fancy-file-input",["jquery"],a):a(jQuery)}(function(a){"use strict";function b(c,d){var e=a(c).data("FancyFileInput");return e?e:(d=a.extend({},b.defaults,d),this.el=c,this.$el=a(c),this.$label=this.createLabel(d.buttonText),this._addLabelText(),this.$clearButton=a("",{text:this.$label.attr("data-ffi-clearButtonText")||d.clearButtonText,"class":"ffi-clear",type:"button",tabindex:"-1"}),this.multipleFileTextPattern=this.$label.attr("data-ffi-multipleFileTextPattern")||d.multipleFileTextPattern,this._eventNamespace=".ffi",this.CLASSES={disabled:"is-disabled",focused:"is-focused",active:"is-active",valid:"is-valid",invalid:"is-invalid"},this[this.isDisabled()?"disable":"enable"](),void(this.isFocused=!1))}var c=/^.*[\\\/]/,d=/\{0\}/gi,e=function(){var a=3,b=document.createElement("div"),c=b.getElementsByTagName("i");do b.innerHTML="";while(c[0]);return a>4?a:document.documentMode}();return a.fn.fancyFileInput=function(c){return this.each(function(){var d=new b(this,c);a(this).data("FancyFileInput",d)})},b.defaults={buttonText:"Browse\u2026",clearButtonText:"Clear",multipleFileTextPattern:"{0} files"},b.prototype._addLabelText=function(){var b=a('label[for="'+this.el.id+'"]');b.length&&this.$el.attr("aria-label",b.text())},b.prototype.createLabel=function(b){var c=this.$el.parent(".ffi[data-ffi-button-text]");return c.length||(c=this.$el.wrap(a("",{"class":"ffi","data-ffi-button-text":b})).parent()),c},b.prototype.isDisabled=function(){return this.$el.is(":disabled")},b.prototype.formatMultipleFileText=function(a){return this.multipleFileTextPattern.replace(d,a)},b.prototype.bindEvents=function(){this.$el.on("invalid"+this._eventNamespace,a.proxy(this.checkValidity,this)).on("change"+this._eventNamespace,a.proxy(this.change,this)).on("keydown"+this._eventNamespace,a.proxy(this.keydown,this)).on("mousedown"+this._eventNamespace,a.proxy(this.mousedown,this)).on("mouseup"+this._eventNamespace,a.proxy(this.mouseup,this)).on("focus"+this._eventNamespace,a.proxy(this.focus,this)).on("blur"+this._eventNamespace,a.proxy(this.blur,this)),this.$clearButton.on("click"+this._eventNamespace,a.proxy(this.clear,this))},b.prototype.unbindEvents=function(){this.$el.off(this._eventNamespace),this.$clearButton.off(this._eventNamespace)},b.prototype.fireEvent=function(a){this.$el.trigger(a+this._eventNamespace)},b.prototype.enable=function(){this.bindEvents(),this.$el.prop("disabled",!1),this.$label.removeClass(this.CLASSES.disabled)},b.prototype.disable=function(){this.unbindEvents(),this.$el.prop("disabled",!0),this.$label.addClass(this.CLASSES.disabled)},b.prototype.clear=function(){return this.el.value="",this.cloneAndReplaceField(),this.change(),!1},b.prototype.cloneAndReplaceField=function(){var a=this.$el.clone();this.$el.replaceWith(a),this.unbindEvents(),this.$el=a,this.el=a[0],this.bindEvents()},b.prototype.focus=function(){var a=this;this.$label.addClass(this.CLASSES.focused),e&&!this.isFocused&&(this.isFocused=!0,setTimeout(function(){a.$el.blur(),a.$el.focus()},0))},b.prototype.blur=function(){e&&this.isFocused||(this.$label.removeClass(this.CLASSES.focused),this.isFocused=!1)},b.prototype.mousedown=function(){this.$label.addClass(this.CLASSES.active)},b.prototype.mouseup=function(){this.$label.removeClass(this.CLASSES.active)},b.prototype.keydown=function(a){var b=a.which,c=8,d=9,f=46;if((b===c||b===f)&&(this.clear(),a.preventDefault()),e&&b===d){var g=this;this.isFocused=!1,this.$el.prop("disabled",!0),setTimeout(function(){g.$el.prop("disabled",!1).blur()},0)}},b.prototype.checkValidity=function(){if(this.el.required){var a=this.$el.is(":invalid");this.$label.toggleClass(this.CLASSES.invalid,a).toggleClass(this.CLASSES.valid,!a)}},b.prototype.change=function(){var a,b="";this.checkValidity(),a=this.el.multiple&&this.el.files.length>1?this.formatMultipleFileText(this.el.files.length):this.el.value,a.length?(b=a.replace(c,""),this.$clearButton.appendTo(this.$label)):this.$clearButton.detach(),this.$el.focus(),this.setFieldText(b),this.fireEvent("value-changed")},b.prototype.setFieldText=function(a){var b="data-ffi-value";a.length?(this.$label.attr(b,a),this.fireEvent("value-added")):(this.$label.removeAttr(b),this.fireEvent("value-cleared"))},b});
\ No newline at end of file
diff --git a/test-coverage/1.0.0/cloud.js b/test-coverage/1.0.0/cloud.js
new file mode 100644
index 0000000..ee7142f
--- /dev/null
+++ b/test-coverage/1.0.0/cloud.js
@@ -0,0 +1,12 @@
+function showDeepPackageCloud(button) {
+ /* TODO toggling does not work */
+ var show = ($(button).attr('aria-pressed') == undefined || $(button).attr('aria-pressed') == false);
+ if (show) {
+ document.getElementById('deepPackageCloud').style.display = 'block';
+ document.getElementById('shallowPackageCloud').style.display = 'none';
+ } else {
+ document.getElementById('shallowPackageCloud').style.display = 'block';
+ document.getElementById('deepPackageCloud').style.display = 'none';
+ }
+ $(button).attr('aria-pressed', show);
+}
diff --git a/test-coverage/1.0.0/clover-descriptions.js b/test-coverage/1.0.0/clover-descriptions.js
new file mode 100644
index 0000000..7b57328
--- /dev/null
+++ b/test-coverage/1.0.0/clover-descriptions.js
@@ -0,0 +1,68 @@
+var CLOUD_LABELS = ["0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100"];
+var CLOUD_MIN_MAX_LABELS = ["Min", "", "", "", "", "", "", "", "", "Max"];
+var CLOUD_MIN_MAX_LABEL_CLASSES = ["cloud-report-min-label", "", "", "", "", "", "", "", "", "cloud-report-max-label"];
+
+function cloudDescriptionTable(labels, labelClasses) {
+ var table = '' +
+ '
' +
+ '' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ';
+
+
+ if (labelClasses) {
+ labels.forEach(function (element, index) {
+ table += "" + element + " ";
+ });
+ } else {
+ labels.forEach(function (element, index) {
+ table += "" + element + " ";
+ });
+ }
+ table += '
';
+ return table;
+}
+
+
+function topRisksDescription() {
+ var description = "The Top Risks tag cloud highlights those classes that are the most complex, yet are" +
+ "the least covered by your tests. The larger and redder the class, the greater" +
+ "the risk that class poses for your project or package.
" +
+ "Font size represents" +
+ "the Average Method Complexity metric, while the colour represents the Total" +
+ "Coverage metric as follows:
";
+ return description + cloudDescriptionTable(CLOUD_LABELS);
+}
+
+function quickWinsDescription() {
+ var description = "The Quick Wins tag cloud highlights the \"low hanging coverage fruit\" of your project" +
+ "or package. You will achieve the greatest increase in overall code coverage by" +
+ "covering the largest, reddest classes first. Big red classes contain the highest" +
+ "number of untested elements.
" +
+ "Font size represents the Number of Elements metric," +
+ "while the colour represents the Number of Tested Elements as follows:" +
+ "
";
+
+ return description + cloudDescriptionTable(CLOUD_MIN_MAX_LABELS, CLOUD_MIN_MAX_LABEL_CLASSES);
+}
+
+function treeMapDescription() {
+ var description = "The coverage treemap report allows simultaneous comparison of classes and package by" +
+ "complexity and by code coverage. This is useful for spotting untested clusters of code." +
+ "The treemap is divided by package (labelled) and" +
+ "then further divided by class (unlabelled). The size of the package or class" +
+ "indicates its complexity (larger squares indicate great complexity, while smaller" +
+ "squares indicate less complexity).
" +
+ "Colours indicate the level of coverage, as follows:
";
+
+ return description + cloudDescriptionTable(CLOUD_LABELS);
+}
\ No newline at end of file
diff --git a/test-coverage/1.0.0/clover-tree.js b/test-coverage/1.0.0/clover-tree.js
new file mode 100644
index 0000000..adeddcd
--- /dev/null
+++ b/test-coverage/1.0.0/clover-tree.js
@@ -0,0 +1,734 @@
+(function($){
+
+ var nodes = {},
+ nodesByIds = {},
+ dashedNodesIds = {},
+ uiBackup = {};
+
+ var keyboardSelectedId;
+ var keyboardSelectedIndex;
+
+ /**
+ * Classes uses by UI elements
+ */
+ var classes = {
+ "arrow": {
+ "collapsed": "aui-icon aui-icon-small clover-tree-package-node-arrow aui-iconfont-collapsed",
+ "expanded": "aui-icon aui-icon-small clover-tree-package-node-arrow aui-iconfont-expanded"
+ },
+ "icon": {
+ "open": "aui-icon aui-icon-small clover-tree-package-node-icon aui-iconfont-devtools-folder-open",
+ "closed": "aui-icon aui-icon-small clover-tree-package-node-icon aui-iconfont-devtools-folder-closed"
+ },
+ "list": {
+ "hidden": "clover-tree-packages-list hidden",
+ "visible": "clover-tree-packages-list"
+ }
+ };
+
+ /**
+ * Explicitly defined UI elements
+ */
+ var ui = {
+ packageLink: '.clover-tree-package-link',
+ node: '.clover-tree-package-node',
+ list: '.clover-tree-packages-list',
+ rootList: ".clover-tree-root-list"
+ };
+
+ /**
+ * Definition of event handlers to be attached
+ */
+ var events = {
+ "click packageLink": "onLinkClick",
+ "mouseover node": "onNodeMouseOver",
+ "mouseout node": "onNodeMouseOut",
+ "click node": "onNodeClick"
+ };
+
+ /**
+ * The event handlers themselves
+ */
+ var eventHandlers = {
+ "onLinkClick": function(e){
+ e.stopPropagation();
+ },
+ "onNodeMouseOver": function(e){
+ e.stopPropagation();
+ $(e.currentTarget).addClass("hovered");
+ },
+ "onNodeMouseOut": function(e){
+ e.stopPropagation();
+ $(e.currentTarget).removeClass("hovered");
+ },
+ "onNodeClick": function(e, options){
+ e.stopPropagation();
+ toggleOpen($(e.currentTarget).data("node-id"), options);
+ }
+ };
+
+ /**
+ * Replaces values in UI hash with corresponding jQuery collections
+ */
+ var bindUIElements = function(options){
+ uiBackup = $.extend({}, ui);
+
+ $.each(ui, function(key, selector){
+ ui[key] = options.placeholder.find(selector);
+ });
+ };
+
+ /**
+ * Delegate event handling for defined events for UI elements, as well
+ * as event handlers for placeholder
+ */
+ var bindEvents = function(options){
+ $.each(events, function(descriptor, handlerName){
+ var tmp = descriptor.split(" ");
+
+ options.placeholder.on(tmp[0], uiBackup[tmp[1]], function(e){
+ eventHandlers[handlerName](e, options);
+ });
+ });
+
+ _updateNodeRowsWidth(options);
+
+ $(options.wrapper).on("scroll", function(){
+ var left = $(this).scrollLeft();
+
+ _updateNodeRowsWidth(options);
+
+ $(".clover-tree-package-node-row").each(function(index, elem){
+ var newLeft = $(elem).data("default-left") + left;
+
+ $(elem).css("left", newLeft+"px");
+ });
+
+ $(options.lozengesPlaceholder).css({
+ right: -left+"px"
+ });
+ });
+ };
+
+ /**
+ * Execute given function for all the nodes in the tree
+ */
+ var iterateOverTree = function(func, _nodes, parentData){
+ var _nodes = _nodes || nodes;
+ var parentData = parentData || null;
+
+ $.each(_nodes, function(index, nodeData){
+ var shouldContinue = func(nodeData, parentData);
+
+ if (shouldContinue !== false && nodeData.children.length){
+ iterateOverTree(func, nodeData.children, nodeData);
+ }
+ });
+ };
+
+ /**
+ * Helper function intended to be used only internally, update of rows' width is necessary
+ * since otherwise the area of tree can be scrolled indefinitely
+ */
+ var _updateNodeRowsWidth = function(options){
+ $(".clover-tree-package-node-row").css({
+ width: options.placeholder.width()+"px"
+ });
+ };
+
+ /**
+ * Helper function intended to be used only internally
+ */
+ var _isNodeVisible = function(nodeData, parentData){
+ var visible = ((parentData && parentData.state.open && !parentData.hasHiddenClass) || parentData === null) &&
+ !nodeData.hasHiddenClass;
+
+ return visible;
+ };
+
+ /**
+ * Update the list of currently visible nodes (linearly, as they are shown) and return it
+ */
+ var getVisibleNodesList = function(){
+ var visibleNodes = [];
+
+ iterateOverTree(function(nodeData, parentData){
+ var visible = _isNodeVisible(nodeData, parentData);
+
+ if (visible){
+ visibleNodes.push(nodeData.id);
+ }
+
+ return visible;
+ });
+
+ return visibleNodes;
+ };
+
+ /**
+ * Get the width of the tree by computing offset and length of the deepest items
+ */
+ var getTreeWidth = function(){
+ var maxDepth = 0;
+ var maxWidth = 0;
+ var nodes = [];
+
+ $.each(getVisibleNodesList(), function(index, id){
+ var depth = getNodeData(id).depth;
+
+ if (depth > maxDepth){
+ nodes = [id];
+ maxDepth = depth;
+ } else if (depth === maxDepth){
+ nodes.push(id);
+ }
+ });
+
+ $.each(nodes, function(index, id){
+ var width = $("#" + dashedNodesIds[id] + "-name").width();
+
+ if (width > maxWidth){
+ maxWidth = width;
+ }
+ });
+
+ return maxWidth + maxDepth * 120;
+ };
+
+ /**
+ * Transform packages input to the format digestable by the plugin
+ */
+ var prepareNodes = function(packages){
+ nodes = packages;
+
+ iterateOverTree(function(nodeData, parentData){
+ dashedNodesIds[nodeData.id] = "clover-package-node-" + nodeData.id.replace(/\./g, "-");
+ nodeData.parent_id = parentData ? parentData.id : null;
+ nodesByIds[nodeData.id] = nodeData;
+
+ nodeData.state = {
+ open: true
+ };
+
+ nodeData.depth = parentData ? parentData.depth + 1 : 0;
+ });
+ };
+
+ /**
+ * Create a DOM representation of a single node and return it
+ */
+ var renderNode = function(nodeData, options){
+ var $node = $(' ');
+
+ // the magical values below should be keep in sync with css rules
+ var left = (nodeData.depth * -28) - 16;
+ var $row = $("
")
+ .addClass("clover-tree-package-node-row")
+ .data("default-left", left)
+ .css("left", left+"px");
+
+ $node.append($row);
+ $node.attr("id", dashedNodesIds[nodeData.id]);
+ $node.data("node-id", nodeData.id);
+
+ if (nodeData.children && nodeData.children.length){
+ $node.append(
+ $(" ")
+ .addClass(classes.arrow.collapsed)
+ .attr("id", dashedNodesIds[nodeData.id]+"-arrow")
+ );
+ }
+
+ $node.append(
+ $(" ")
+ .addClass(classes.icon.closed)
+ .attr("id", dashedNodesIds[nodeData.id]+"-icon")
+ );
+
+ if (nodeData.a_attr.href){
+ $node.append(
+ $(" ")
+ .addClass("clover-tree-package-link")
+ .addClass(nodeData.id === options.currentPackage ? "clover-tree-current-package" : "")
+ .attr("href", options.urlPrefix + nodeData.a_attr.href)
+ .attr("id", dashedNodesIds[nodeData.id]+"-name")
+ .html(nodeData.text)
+ );
+ } else {
+ $node.append(
+ $(" ")
+ .addClass("clover-tree-package-name")
+ .attr("id", dashedNodesIds[nodeData.id]+"-name")
+ .html(nodeData.text)
+ );
+ }
+
+ if (nodeData.children.length){
+ var $ul = $('');
+ $ul.addClass(classes.list.hidden);
+ $ul.attr("id", dashedNodesIds[nodeData.id]+"-list")
+
+ $.each(nodeData.children, function(index, nodeData2){
+ $ul.append(renderNode(nodeData2, options));
+ });
+
+ $node.append($ul);
+ }
+
+ nodeData.state.open = false;
+
+ return $node;
+ };
+
+ /**
+ * Render the entire tree into the given placeholder
+ */
+ var render = function(options){
+ var $tree = $('');
+
+ $.each(nodes, function(index, nodeData){
+ $tree.append(renderNode(nodeData, options));
+ });
+
+ options.placeholder.html($tree);
+
+ renderLozenges(options);
+ };
+
+ /**
+ * Render the vertical strip containing lozenges
+ */
+ var renderLozenges = function(options){
+ var visible = getVisibleNodesList();
+
+ $(options.lozengesPlaceholder).html("");
+
+ $.each(visible, function(index, nodeId){
+ var nodeData = getNodeData(nodeId);
+ var $span = $(" ")
+ .addClass("clover-package-node-lozenge-placeholder");
+
+ if (nodeData.coverage){
+ $span.append(
+ $(" ")
+ .addClass("aui-lozenge aui-lozenge-subtle clover-package-node-lozenge")
+ .html(nodeData.coverage)
+ );
+ }
+
+ $(options.lozengesPlaceholder).append($span);
+ });
+
+ // adjust right padding of list item so that visually there's always the same margin
+ // between list items and lozenges
+ var width = $(options.lozengesPlaceholder).outerWidth();
+ $(".clover-tree-package-link").css("margin-right", width+8+"px");
+ };
+
+ /**
+ * Toggle state of the node with given id
+ */
+ var toggleOpen = function(nodeId, options){
+ var nodeData = getNodeData(nodeId);
+
+ if (nodeData.state.open){
+ closeNode(nodeId);
+ } else {
+ openNode(nodeId);
+ }
+
+ renderLozenges(options);
+ _updateNodeRowsWidth(options);
+ };
+
+ /**
+ * Return the data of node with given id
+ */
+ var getNodeData = function(nodeId){
+ return nodesByIds[nodeId];
+ };
+
+ /**
+ * Return the DOM representation of the node with given id
+ */
+ var getNodeDOMElement = function(nodeId){
+ return $("#" + dashedNodesIds[nodeId]);
+ };
+
+ /**
+ * Open node with given id
+ */
+ var openNode = function(nodeId){
+ var nodeData = getNodeData(nodeId);
+
+ if (!nodeData || nodeData.state.open) return;
+
+ if (!nodeData.children || !nodeData.children.length){
+ return;
+ }
+
+ var selector = "#" + dashedNodesIds[nodeId] + "-";
+ var arrow = $(selector + "arrow");
+ var list = $(selector + "list");
+
+ if (arrow.length){
+ arrow[0].className = classes.arrow.expanded;
+ }
+
+ if (list.length){
+ list[0].className = classes.list.visible;
+ }
+
+ $(selector + "icon")[0].className = classes.icon.open;
+
+ nodeData.state.open = true;
+ };
+
+ /**
+ * Close node with given id
+ */
+ var closeNode = function(nodeId){
+ var nodeData = getNodeData(nodeId);
+
+ if (!nodeData || !nodeData.state.open) return;
+
+ if (!nodeData.children || !nodeData.children.length){
+ return;
+ }
+
+ var selector = "#" + dashedNodesIds[nodeId] + "-";
+ var arrow = $(selector + "arrow");
+ var list = $(selector + "list");
+
+ if (arrow.length){
+ arrow[0].className = classes.arrow.collapsed;
+ }
+
+ if (list.length){
+ list[0].className = classes.list.hidden;
+ }
+
+ $(selector + "icon")[0].className = classes.icon.closed;
+
+ nodeData.state.open = false;
+ };
+
+ /**
+ * Close all the nodes by iteratively closing each single one
+ */
+ var closeAllNodes = function(){
+ iterateOverTree(function(nodeData){
+ closeNode(nodeData.id);
+ });
+ };
+
+ /**
+ * Open all the nodes by iteratively opening each single one
+ */
+ var openAllNodes = function(){
+ iterateOverTree(function(nodeData){
+ openNode(nodeData.id);
+ });
+ };
+
+ /**
+ * Open all the parent nodes of the one with given id; if the second
+ * parameter is set to true, open the innermost node too
+ */
+ var openNodesTo = function(nodeId, openInnermost){
+ var nodeData = getNodeData(nodeId);
+
+ if (!nodeData) return;
+
+ var parentId = nodeData.parent_id;
+ var openInnermost = !!openInnermost;
+
+ if (openInnermost){
+ openNode(nodeId);
+ }
+
+ while (parentId !== null){
+ openNode(parentId);
+ parentId = getNodeData(parentId).parent_id;
+ }
+ };
+
+ /**
+ * Save the tree instance options by attaching it to the placeholder
+ */
+ var saveTreeOptions = function(options){
+ options.placeholder.data("clover-packages-options", options);
+ };
+
+ /**
+ * Get the tree instance options for given placeholder
+ */
+ var getTreeOptions = function(placeholder){
+ return placeholder.data("clover-packages-options");
+ };
+
+ /**
+ * Unhide nodes that got hidden for the purpose of clean search results
+ */
+ var unhideNodes = function(){
+ $(".clover-package-node-hidden").each(function(index, elem){
+ var id = $(elem).data("node-id");
+ getNodeData(id).hasHiddenClass = false;
+
+ $(elem).removeClass("clover-package-node-hidden");
+ });
+ };
+
+ /**
+ * Compute search result
+ */
+ var computeSearchResult = function(query){
+ var hasDot = query.indexOf(".") >= 0;
+ var hidden = [], results = [], total = 0;
+
+ // check if id1 is (direct or indirect) parent of id2
+ var isParentOf = function(id1, id2){
+ return id2.indexOf(id1 + ".") === 0;
+ };
+
+ var isSiblingOf = function(id1, id2){
+ var pos1 = id1.lastIndexOf(".");
+ var pos2 = id2.lastIndexOf(".");
+
+ return id1.substr(0, pos1) === id2.substr(0, pos2);
+ };
+
+ var collectResult = function(id){
+ var childrenAlready = false;
+ var siblingAlready = false;
+
+ Object.keys(results).forEach(function(elem){
+ if (!childrenAlready && !siblingAlready && isParentOf(id, elem)){
+ childrenAlready = true;
+ total++;
+ }
+
+ if (!childrenAlready && !siblingAlready && isSiblingOf(id, elem)){
+ siblingAlready = true;
+ total++;
+ }
+ });
+
+ if (!childrenAlready && !siblingAlready){
+ results.push(id);
+ total++;
+ }
+ };
+
+ var func = function(nodes){
+ var foundInChildren = false;
+ var foundInNodes = false;
+
+ $.each(nodes, function(index, nodeData){
+ var foundInSingleNode = false;
+
+ if (!hasDot && nodeData.text.indexOf(query) !== -1){
+ foundInSingleNode = true;
+ } else if (hasDot && nodeData.id.indexOf(query) !== -1){
+ foundInSingleNode = true;
+ }
+
+ if (nodeData.children){
+ foundInChildren = func(nodeData.children)
+ }
+
+ foundInNodes = foundInNodes || foundInSingleNode || foundInChildren;
+
+ if (!foundInSingleNode && !foundInChildren){
+ hidden.push(nodeData.id);
+ } else if (foundInSingleNode){
+ collectResult(nodeData.id);
+ }
+ });
+
+ return foundInNodes;
+ };
+ func(nodes);
+
+ return {
+ hidden: hidden,
+ results: results,
+ total: total
+ };
+ };
+
+ /**
+ * Perform a search on the tree, including synchronisation with previous searches
+ * and UI changes
+ */
+ var search = function(options){
+ closeAllNodes();
+
+ if (!options.search.length){
+ $(options.noResultsMessage).hide();
+ ui.rootList.show();
+ unhideNodes();
+ openNodesTo(options.currentPackage);
+ renderLozenges(options);
+
+ return;
+ }
+
+ var results = computeSearchResult(options.search);
+
+ if (results.total){
+ $(options.noResultsMessage).hide();
+ ui.rootList.show();
+
+ $.each(results.results, function(index, id){
+ openNodesTo(id);
+ });
+
+ unhideNodes();
+ var visible = getVisibleNodesList();
+
+ $.each(results.hidden, function(index, id){
+ if (visible.indexOf(id) !== -1){
+ getNodeData(id).hasHiddenClass = true;
+ getNodeDOMElement(id).addClass("clover-package-node-hidden");
+ }
+ });
+ } else {
+ $(options.noResultsMessage).show();
+ ui.rootList.hide();
+ }
+
+ renderLozenges(options);
+ };
+
+ /**
+ * Helper function used to remove selection made by keyboard, intended to be used only internally.
+ */
+ var _unhoverAllKeyboardSelections = function(){
+ $(".keyboard-hovered").removeClass("keyboard-hovered");
+ };
+
+ /**
+ * Handle keyboard to operate on tree.
+ */
+ var handleKeyDown = function(options){
+ var key = options.keyDown;
+ var special = [13, 37, 38, 39, 40];
+ var visible = getVisibleNodesList();
+
+ if (special.indexOf(key) === -1){
+ return;
+ }
+
+ var selectNode = function(nodeId, select){
+ var select = select === undefined ? true : select;
+
+ if (nodeId){
+ getNodeDOMElement(nodeId)[select ? "addClass" : "removeClass"]("keyboard-hovered");
+ }
+ };
+
+ var previouslySelected = keyboardSelectedId;
+ if (visible.indexOf(keyboardSelectedId) === -1){
+ _unhoverAllKeyboardSelections();
+ keyboardSelectedId = undefined;
+ keyboardSelectedIndex = undefined;
+ }
+
+ if (key === 38){ // up
+ if (keyboardSelectedIndex === undefined){
+ keyboardSelectedIndex = visible.length - 1;
+ } else {
+ keyboardSelectedIndex--;
+ }
+
+ if (keyboardSelectedIndex < 0){
+ keyboardSelectedIndex = visible.length - 1;
+ }
+
+ keyboardSelectedId = visible[keyboardSelectedIndex];
+ selectNode(previouslySelected, false);
+ selectNode(keyboardSelectedId);
+ } else if (key === 40){ // down
+ if (keyboardSelectedIndex === undefined){
+ keyboardSelectedIndex = 0;
+ } else {
+ keyboardSelectedIndex++;
+ }
+
+ if (keyboardSelectedIndex >= visible.length){
+ keyboardSelectedIndex = 0;
+ }
+
+ keyboardSelectedId = visible[keyboardSelectedIndex];
+ selectNode(previouslySelected, false);
+ selectNode(keyboardSelectedId);
+ } else if (key === 39){ // right
+ openNode(keyboardSelectedId);
+ renderLozenges(options);
+ } else if (key === 37){ // left
+ closeNode(keyboardSelectedId);
+ renderLozenges(options);
+ } else if (key === 13){ // enter
+ var $link = getNodeDOMElement(keyboardSelectedId).children(".clover-tree-package-link");
+
+ if ($link.length){
+ window.location = $link.attr("href");
+ }
+ }
+ };
+
+ /**
+ * Reset selection made using keyboard
+ */
+ var resetKeyboardSelection = function(options){
+ _unhoverAllKeyboardSelections();
+
+ keyboardSelectedId = undefined;
+ keyboardSelectedIndex = undefined;
+ };
+
+ /**
+ * The jQuery plugin itself
+ */
+ $.fn.cloverPackages = function(options){
+ var options = $.extend({
+ placeholder: this
+ }, getTreeOptions(this), options);
+
+ if (typeof options.search !== "undefined"){
+ search(options);
+
+ return this;
+ }
+
+ if (typeof options.keyDown !== "undefined"){
+ handleKeyDown(options);
+
+ return this;
+ }
+
+ if (options.resetKeyboardSelection === true){
+ resetKeyboardSelection(options);
+
+ return this;
+ }
+
+ if (!options.packages){
+ throw new Error("CloverPackages requires packages option!");
+ }
+
+ saveTreeOptions(options);
+ prepareNodes(options.packages);
+ render(options);
+ bindUIElements(options);
+ bindEvents(options);
+
+ openNodesTo(options.currentPackage, true);
+
+ renderLozenges(options);
+
+ return this;
+ };
+
+})(jQuery);
diff --git a/test-coverage/1.0.0/clover.js b/test-coverage/1.0.0/clover.js
new file mode 100644
index 0000000..04c4faa
--- /dev/null
+++ b/test-coverage/1.0.0/clover.js
@@ -0,0 +1,893 @@
+AJS.$(function($) {
+ // initialize tooltips on all elements with title attribute
+ $("[title]").tooltip({
+ aria:true,
+ html: true,
+ hideOnClick: true,
+ hoverable: false,
+ gravity: $.fn.tipsy.autoWE
+ });
+
+
+ // shows the dialog when the "Show dialog" button is clicked
+ $(".dialog-show-button").click(function(e) {
+ AJS.dialog2("#" + $(this).data('dialog-id')).show();
+ });
+
+ // hides the dialog
+ $(".dialog-close-button").click(function(e) {
+ e.preventDefault();
+ AJS.dialog2("#" + $(this).data('dialog-id')).hide();
+ });
+
+ // set checkbox state, firing an event only if state has changed
+ // element - jquery object
+ // newValue - true/false
+ function toggleWithEvent(element, newValue) {
+ if (element.prop('checked') != newValue) {
+ element.prop('checked', newValue);
+ element.change(); // fire event
+ }
+ }
+
+ var $testMethodCheckboxesToggle = $("#selectalltests");
+ var $testMethodCheckboxes = $('input[name="testMethod"]');
+ // select all tests for hi-lighting
+ $testMethodCheckboxesToggle.click(function toggleSelectAllTests() {
+ if (!$testMethodCheckboxesToggle.hasClass("active")) {
+ $testMethodCheckboxes.each(function () { toggleWithEvent($(this), true) } );
+ $testMethodCheckboxesToggle.addClass("active");
+ } else {
+ $testMethodCheckboxes.each(function () { toggleWithEvent($(this), false) } );
+ $testMethodCheckboxesToggle.removeClass("active");
+ }
+ });
+
+ $testMethodCheckboxes.change(function(element) {
+ // change state of the main button
+ if ($testMethodCheckboxes.length != $('input[name="testMethod"]:checked').length) {
+ $testMethodCheckboxesToggle.removeClass("active");
+ } else {
+ $testMethodCheckboxesToggle.addClass("active");
+ }
+
+ // highlight source code and methods
+ hiLightByTest($(this).prop('value'), $(this).prop('checked'));
+ });
+
+ // ======================================================================
+
+ var $packagesTree = $(".packages-tree-container");
+ var $packagesWrapper = $(".packages-tree-wrapper");
+
+ $packagesTree.cloverPackages({
+ currentPackage: $packagesTree.parent().data("package-name"),
+ lozengesPlaceholder: ".clover-packages-lozenges",
+ noResultsMessage: ".package-filter-no-results-message",
+ packages: Packages.nodes,
+ urlPrefix: $packagesTree.parent().data("root-relative"),
+ wrapper: ".packages-tree-wrapper"
+ });
+ $packagesTree.data("current-search", "");
+
+ var $filterForm = $('.package-filter-container');
+ var $filterInput = $('#package-filter');
+
+ $filterForm.submit(function(e) {
+ e.preventDefault();
+ });
+
+ $filterInput.on("input keyup", function(e){
+ var val = $filterInput.val();
+
+ if ($packagesTree.data("current-search") !== val){
+ $packagesTree.data("current-search", val);
+
+ $packagesTree.cloverPackages({
+ "search": val
+ });
+ }
+ });
+
+ $filterInput.on("keydown", function(e){
+ var special = [13, 27, 37, 38, 39, 40];
+
+ if (special.indexOf(e.which) !== -1){
+ e.preventDefault();
+
+ if (e.which === 27){
+ $filterInput.val("");
+
+ $packagesTree.data("current-search", "");
+ $packagesTree.cloverPackages({
+ "search": ""
+ });
+ } else {
+ $packagesTree.cloverPackages({
+ "keyDown": e.which
+ });
+ }
+ }
+ });
+
+ $filterInput.on("blur", function(){
+ $packagesTree.cloverPackages({
+ "resetKeyboardSelection": true
+ });
+ });
+
+ /* === sidebar === */
+
+ var updateSidebarHeight = function(){
+ var $footer = $("#footer");
+ var $sidebar = $(".aui-page-panel-nav-clover");
+ var clientHeight = document.documentElement.clientHeight;
+ var height = clientHeight - parseInt($sidebar.css("top"));
+
+ $sidebar.css({
+ height: height+"px",
+ visibility: "visible"
+ });
+
+ $packagesWrapper.css({
+ height: height-217+"px"
+ });
+
+ $footer.css("margin-top", "0px");
+
+ var footerOffset = $footer.offset();
+ var footerHeight = $footer.outerHeight();
+ var marginTop = clientHeight - footerOffset.top - footerHeight - 1;
+
+ if (marginTop > 0){
+ $footer.css("margin-top", marginTop + "px");
+ }
+
+ $filterInput.focus();
+ };
+
+ updateSidebarHeight();
+
+ $(window).on("resize", updateSidebarHeight);
+});
+
+
+var SRC_FILE_LEGEND_TEXT =
+ 'Legend ' +
+ 'Left margin ruler ' +
+ 'Left margin ruler shows information about global and per-test coverage
' +
+ '' +
+ '' +
+ '' +
+ 'line# ' +
+ 'hit count ' +
+ ' ' +
+ ' ' +
+ '1 ' +
+ '17 ' +
+ 'line was covered, but not by a test (e.g. by main(), setUp() or tearDown() method) ' +
+ ' ' +
+ '2 ' +
+ '86 ' +
+ 'line was covered by test(s) which passed ' +
+ ' ' +
+ '3 ' +
+ '7 ' +
+ 'line was covered by test(s) which did not pass (includeFailedTestCoverage=true) ' +
+ ' ' +
+ '4 ' +
+ '7 ' +
+ 'line was covered by test(s) which did not pass (includeFailedTestCoverage=false) ' +
+ ' ' +
+ '5 ' +
+ '1 ' +
+ 'line is covered partially (i.e some branch or a statement was not covered) and was hit by a test ' +
+ ' ' +
+ '6 ' +
+ '1 ' +
+ 'line is covered partially, but not by a test ' +
+ ' ' +
+ '7 ' +
+ '0 ' +
+ 'line was not covered at all ' +
+ ' ' +
+ '8 ' +
+ ' ' +
+ 'line was filtered ' +
+ ' ' +
+ '
' +
+ 'Source code highlighting ' +
+ 'Highlighing shows information about contributing tests as well as about code which was not covered or filtered.
' +
+ '' +
+ '' +
+ '' +
+ ' ' +
+ ' ' +
+ 'line not covered by any of the selected tests ' +
+ ' ' +
+ 'line hit by more than one of the selected tests ' +
+ ' ' +
+ 'line hit by one test only (unique per-test coverage) ' +
+ ' ' +
+ 'line hit by one or more of the selected tests that all failed ' +
+ ' ' +
+ 'line was not covered (partially or at all) ' +
+ ' ' +
+ 'line was filtered ' +
+ ' ' +
+ '
';
+
+// close a modal dialog with the given id and scroll view
+function closeDialogAndScrollTo(modalDialogId, anchor) {
+ AJS.dialog2("#" + modalDialogId).hide();
+ location.hash = "#" + anchor;
+}
+
+// Filter rows in 'Contributing tests' table by a test name (it's in a 2nd or a 3rd column)
+// @param tableBodyId - id of containing rows to be filtered
+// @param inputFilterId - id of the input field with a substring to match
+// @param testColumnNo - number of a column containing test name
+function filterTests(tableBodyId, inputFilterId, testColumnNo) {
+ var searchedText = $("#" + inputFilterId).attr('value');
+ if (searchedText == undefined || $.trim(searchedText).length == 0) {
+ // show all rows
+ $("#" + tableBodyId + " > tr").show();
+ } else {
+ // walk through all rows and hide those where 3rd td has a href's text matching text
+ $("#" + tableBodyId + " > tr")
+ .has("td:nth-child(" + testColumnNo + ") > span:not( :contains('" + $.trim(searchedText) + "') )")
+ .hide();
+ $("#" + tableBodyId + " > tr")
+ .has("td:nth-child(" + testColumnNo + ") > span:contains('" + $.trim(searchedText) + "')")
+ .show();
+ }
+}
+
+// Filter rows in 'Class methods' table by a method signature (it's in a 1st column)
+// @param tableBodyId - id of containing rows to be filtered
+// @param inputFilterId - id of the input field with a substring to match
+function filterMethods(tableBodyId, inputFilterId) {
+ var searchedText = $("#" + inputFilterId).attr('value');
+ if (searchedText == undefined || $.trim(searchedText).length == 0) {
+ // show all rows
+ $("#" + tableBodyId + " > tr").show();
+ } else {
+ // walk through all rows and hide those where 3rd td has a href's text matching text
+ $("#" + tableBodyId + " > tr")
+ .has("td:nth-child(1):not( :contains('" + $.trim(searchedText) + "') )")
+ .hide();
+ $("#" + tableBodyId + " > tr")
+ .has("td:nth-child(1):contains('" + $.trim(searchedText) + "')")
+ .show();
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////// OLD JS
+
+function toggleInlineStats(ele, hiddenEleId) {
+ var statsEle = document.getElementById(hiddenEleId);
+ var showStats = ele.className.match(/\baui-iconfont-arrows-right\b/);
+ statsEle.style.display = showStats ? '' : 'none';
+ var regex = showStats ? /\baui-iconfont-arrows-right\b/ : /\baui-iconfont-arrows-left\b/ ;
+ var replacement = showStats ? 'aui-iconfont-arrows-left' : 'aui-iconfont-arrows-right';
+ replaceClass(ele, regex, replacement);
+}
+function toggleNodeExpansion(ele, collapsed, expanded) {
+ toggleNodeEx(document.getElementById(ele), document.getElementById(collapsed), document.getElementById(expanded));
+}
+
+function toggleNodeEx(ele, collapsed, expanded) {
+ var expand = expanded.style.display == 'none';
+ collapsed.style.display = expand ? 'none' : '';
+ expanded.style.display = expand ? '' : 'none';
+
+ var regex = expand ? /\bexpand\b/ : /\bcollapse\b/ ;
+ var replacement = expand ? 'collapse' : 'expand';
+ replaceClass(ele, regex, replacement);
+}
+
+function toggleAllInlineMethods(element) {
+ var inlineExpandAll = (element.innerHTML == 'Expand all methods');
+ setToggleLabel(element, inlineExpandAll);
+ var visitor = function (method) {
+ var startEle = document.getElementById('img-' + method.sl);
+ forceToggleSrcRowVis(startEle, method.sl, method.el, inlineExpandAll);
+ };
+ visitAllMethods(visitor);
+}
+
+// traveses the data model executes the visitor() function on each method.
+function visitAllMethods(visitor) {
+
+ var classes = clover.pageData.classes;
+ for (var i = 0; i < classes.length; i++) {
+ var classData = classes[i];
+ var methods = classData.methods;
+ for (var j = 0; j < methods.length; j++) {
+ var method = methods[j];
+ visitor(method);
+ }
+ }
+}
+
+// traveses the DOM, executes visitor for each src-LineNumber element
+function visitAllSrcLines(visitor) {
+
+ var ele;
+ var i = 1;
+ while ((ele = document.getElementById("src-" + i)) != undefined){
+ visitor(ele, i);
+ i++;
+ }
+}
+
+function toggleSrcRowVis(toggle, start, end) {
+ var first = start + 1;
+ var display = 'none';
+ var expand = document.getElementById("l" + first).style.display == 'none';
+ forceToggleSrcRowVis(toggle, start, end, expand);
+}
+
+// expands or collapses a method
+function forceToggleSrcRowVis(toggle, start, end, expand) {
+ var display = expand ? '' : 'none';
+ if (expand) {
+ swapExpandImg(toggle);
+ document.getElementById("e"+start).style.display='none';
+ } else {
+ swapCollapseImg(toggle);
+ document.getElementById("e"+start).style.display='';
+ }
+
+ for (var i = start + 1; i <= end; i++) {
+ document.getElementById("l" + i).style.display = display;
+ }
+}
+
+// Acts as a map: methodStartLine --> hit count
+var methodsToHiLight = new Object();
+// srcLine --> hit count
+var linesToHiLight = new Object();
+// linuNum --> LineTestInfo
+var selectedLinesTestResult = new Object();
+
+function loadPkgPane(title, fileName) {
+ if (parent.packagePane != undefined && fileName != undefined) {
+ parent.packagePane.location.href = fileName;
+ setBrowserTitle(title);
+ }
+}
+
+function setBrowserTitle(title) {
+ if (title != undefined && parent) {
+ parent.document.title = title;
+ }
+}
+
+function parseQueryArgs() {
+ var params = [];
+ var paramsString = window.location.search.split('?')[1];
+ if (paramsString != undefined) {
+ paramsString.split('&').forEach(function (item) {
+ var splitted = item.split("=");
+ params[splitted[0]] = splitted[1];
+ });
+ }
+ return params;
+}
+
+
+//used by src-file.vm
+function onLoad(title) {
+ var queryArgs = parseQueryArgs();
+
+ var testId = queryArgs["id"];
+ var lineNo = queryArgs["line"];
+
+ if (testId != undefined) {
+ hilightTestOnLoad(testId);
+ } else if (lineNo != undefined) {
+ hilightLineOnLoad(lineNo);
+ }
+
+ setBrowserTitle(title);
+
+}
+
+function hilightLineOnLoad(lineNo) {
+ var srcLineSpan = document.getElementById('src-' + lineNo);
+ if (srcLineSpan == undefined) return;
+ window.setTimeout("window.scrollBy(0, -50);", 10);
+ flashLine(srcLineSpan);
+}
+
+function flashLine(obj) {
+ var originalColor = obj.style.backgroundColor;
+ var fade = {
+ full : function() {
+ obj.style.backgroundColor = '#ffe7c6';
+ },
+ clear : function() {
+ obj.style.backgroundColor = originalColor;
+ }
+ };
+ for (var i = 0; i <= 12; i++) {
+ var fadeMethod = (i % 2 == 0) ? fade.clear : fade.full;
+ setTimeout(fadeMethod, 150 * i);
+ }
+}
+
+function hilightTestOnLoad(testId) {
+ var cbox = document.getElementById('cb-' + testId);
+ if (cbox == undefined) return;
+ cbox.checked = true;
+ hiLightByTest(testId, true);
+}
+
+// called in the onlick on the srcLine margin
+function showTestsForLine(ele, startLine, overTitle) {
+ var parentTestDiv = createTableForPopup(startLine);
+ var inlineDialog = AJS.InlineDialog(ele, "testsForLineDialog",
+ function(content, trigger, showPopup) {
+ content.html(
+ '' + overTitle +
+ ' ' +
+ ' '
+ ).append(parentTestDiv);
+ showPopup();
+ return false;
+ },
+ {
+ width: 700,
+ cacheContent: false,
+ hideDelay: 60000,
+ hideCallback: function() {
+ $("#inline-dialog-testsForLineDialog").remove();
+ }
+ }
+ );
+ inlineDialog.show();
+}
+
+
+function showFailingTestsPopup(element, line, traces) {
+ var holderDiv = document.createElement('div');
+
+ for (var i = 0; i < traces.length; i++) {
+ var tid = traces[i][0];
+ var fid = traces[i][1];
+
+ var traceDiv = document.getElementById('trace-'+tid);
+ if (traceDiv == undefined) {
+ continue;
+ }
+ var traceControl = document.getElementById('traceControl').cloneNode(true);
+ traceControl.className = 'expand';
+ traceControl.id = "traceControl"+tid+'-'+i;
+
+ var traceCol = document.getElementById('traceCol'+tid).cloneNode(true);
+ traceCol.id = 'traceCol'+tid+'-'+i;
+ var traceEx = document.getElementById('traceEx'+tid).cloneNode(true);
+ traceEx.id = 'traceEx'+tid+'-'+i;
+
+ var traceLines = traceEx.getElementsByTagName('div');
+
+ traceLines[fid].className='errorTraceStrong';
+
+ holderDiv.appendChild(traceControl);
+ holderDiv.appendChild(traceCol);
+ holderDiv.appendChild(traceEx);
+ holderDiv.appendChild(document.createElement('br'));
+
+ traceControl.setAttribute(
+ "onclick",
+ "toggleNodeExpansion('"+traceControl.id+"', '"+traceCol.id+"', '"+traceEx.id+"');");
+ }
+
+ var inlineDialog = AJS.InlineDialog(element, "testsForLineDialog",
+ function(content, trigger, showPopup) {
+ content.html(
+ 'Test failures at line ' + line + ' ')
+ .append(holderDiv);
+ showPopup();
+ return false;
+ },
+ {
+ width: 600,
+ cacheContent: false
+ }
+ );
+ inlineDialog.show();
+}
+
+// gernerate the contents for the per-srcline popup on the fly.
+function createTableForPopup(startLine) {
+ // a top-level div with a scroll view and a message (optional)
+ var holderDiv = $(document.createElement('div'));
+
+ // create scroll view (scroll bars visible when needed) with an aui table
+ var scrollViewDiv = $(document.createElement('div'));
+ scrollViewDiv.attr('style', 'overflow-x: hidden; overflow-y: auto; max-height:500px; width:100%; padding-right: 20px; border-top: 1px solid #cccccc; border-bottom: 1px solid #cccccc');
+ var table = $(document.createElement('table'));
+ table.addClass('aui'); // TODO aui-table-sortable
+ var thead = $(document.createElement('thead'));
+ var tbody = $(document.createElement('tbody'));
+ tbody.attr('id', 'tests-body-inline-' + startLine);
+ scrollViewDiv.append(table);
+ table.append(thead);
+ table.append(tbody);
+
+ // table header
+ var header = $("#testHeaderRow").clone();
+ header.find("th:first").remove();
+ thead.append(header);
+
+ // table rows
+ var testIdsForLine = clover.srcFileLines[startLine];
+ var missingTestCount = 0;
+ for (var i = 0; i < testIdsForLine.length; i++) {
+ var testId = testIdsForLine[i];
+ var linksRow = $('#test-' + testId);
+ if (linksRow == undefined) {
+ missingTestCount = missingTestCount + 1;
+ continue;
+ }
+
+ // copy row and remove first cell (with a checkbox)
+ var clonedLinksRow = $(linksRow).clone();
+ clonedLinksRow.find("td:first").remove();
+
+ // initialize tooltips on all elements with 'title' attribute in the cloned row; we're searching for the
+ // 'original-title' (instead of 'title'), because the tooltip was already initialized on the original row
+ clonedLinksRow.find("[original-title]").tooltip({
+ aria:true,
+ html: true,
+ hideOnClick: true,
+ hoverable: false,
+ gravity: $.fn.tipsy.autoWE
+ });
+
+ // ensure that the row is visible (the 'display:none' could have been set in the original table)
+ clonedLinksRow.css('display', 'table-row');
+
+ tbody.append(clonedLinksRow[0]);
+ }
+
+ // add an empty line after the table so that it won't touch with scroll bar's bottom border when scrolled down
+ scrollViewDiv.append($(document.createElement('div')).append('
'));
+
+ // add scroll view to a parent
+ holderDiv.append(scrollViewDiv);
+
+ // add message below a scroll view
+ if (missingTestCount > 0) {
+ var textDiv = $(document.createElement('div'));
+ textDiv.html('' + missingTestCount + ' ' +
+ pluralise(missingTestCount, 'test is', 'tests are') +
+ ' not displayed. This report was configured to display the top ' +
+ testsPerFile + ' contributing tests for this file. ');
+ holderDiv.append(textDiv);
+ }
+
+// AJS.tablessortable.setTableSortable($(table)); TODO does not work - double triangle appears
+
+ return holderDiv[0];
+}
+
+function pluralise(count, singular, plural) {
+ return count != 1 ? plural : singular;
+}
+
+
+// highlights source and summary depending on which tests are checked.
+function hiLightByTest(testId, checked) {
+
+ // get all methods hit by the test
+ var methods = getMethodsForTest(testId);
+ if (methods == undefined) return;
+ var testData = getDataForTest(testId);
+ if (testData == undefined) return;
+ var passed = testData.pass;
+
+ addHitsToMap(methods, methodsToHiLight, checked, passed);
+ // now visit all methods on the page, and highlight or unhighlight as needed
+ var visitor = function(method) {
+ var summTd = document.getElementById('summary-' + method.sl + '-' + method.sc);
+
+ if (methodsToHiLight[method.sl] > 0) {
+ addCoverageClass(summTd, selectedLinesTestResult[method.sl]);
+ } else {
+ removeCoverageClass(summTd, selectedLinesTestResult[method.sl]);
+ }
+ };
+ visitAllMethods(visitor);
+
+ // hi-light individual src lines.
+ var statements = getStatementsForTest(testId);
+ if (statements == undefined) return;
+ addHitsToMap(statements, linesToHiLight, checked, passed);
+
+
+ var srcLineVisitor = function(srcEle, lineNumber) {
+
+ if (linesToHiLight[lineNumber] > 0 || methodsToHiLight[lineNumber] > 0) {
+ addCoverageClass(srcEle, selectedLinesTestResult[lineNumber]);
+ } else {
+ removeCoverageClass(srcEle, selectedLinesTestResult[lineNumber]);
+ }
+
+ };
+ visitAllSrcLines(srcLineVisitor);
+}
+
+// collects test info for selected tests per line
+var LineTestInfo = function(lineNum) {
+ this.lineNum = lineNum;
+ this.passes = 0;
+ this.fails = 0;
+};
+
+LineTestInfo.prototype.addResult = function(passed) {
+ if (passed) {
+ this.passes++;
+ } else {
+ this.fails++;
+ }
+};
+
+LineTestInfo.prototype.removeResult = function(passed) {
+ if (passed) {
+ this.passes--;
+ } else {
+ this.fails--;
+ }
+};
+
+LineTestInfo.prototype.isUniqueHit = function() {
+ return clover.srcFileLines[this.lineNum].length == 1;
+};
+
+// Returns true if all selected tests for the line failed
+LineTestInfo.prototype.showFailed = function() {
+ return this.passes <= 0 && this.fails > 0;
+};
+
+LineTestInfo.prototype.calcCoverageClass = function() {
+ if (this.showFailed()) {
+ return "coveredByFailedTest";
+ }
+
+ if (this.isUniqueHit()) {
+ return "coveredByTestUniq";
+ }
+
+ return "coveredByTest"
+
+};
+
+
+function addHitsToMap(hitElements, elementsToHiLight, checked, passed) {
+
+ for(var i = 0; i < hitElements.length; i++) {
+ var ele = hitElements[i];
+ var currCount = elementsToHiLight[ele.sl];
+ currCount = currCount == undefined ? 0 : currCount;
+ var increment = checked ? 1 : -1;
+ elementsToHiLight[ele.sl] = currCount + increment;
+
+ // get the test info object for the current line and add result
+ var info = selectedLinesTestResult[ele.sl] ? selectedLinesTestResult[ele.sl] : new LineTestInfo(ele.sl);
+ if (checked) {
+ info.addResult(passed);
+ } else {
+ info.removeResult(passed);
+ }
+ selectedLinesTestResult[ele.sl] = info;
+ }
+}
+
+// gets all the methods hit by a given test.
+function getMethodsForTest(testId) {
+ var testData = getDataForTest(testId);
+ if (testData == undefined) return;
+
+ var methods = testData.methods;
+ if (methods == undefined) return;
+ return methods;
+}
+
+// gets all the statements hit by a given test.
+function getStatementsForTest(testId) {
+ var testData = getDataForTest(testId);
+ if (testData == undefined) return;
+
+ var statements = testData.statements;
+ if (statements == undefined) return;
+ return statements;
+}
+
+function getDataForTest(testId) {
+ if (testId == undefined) return;
+
+ var testData = clover.testTargets['test_' + testId];
+ if (testData == undefined) return;
+
+ return testData;
+}
+
+function toggleStats(eleToHide, eleToDisplay) {
+ displayEle(document.getElementById(eleToDisplay));
+ hideEle(document.getElementById(eleToHide));
+}
+
+function displayEle(ele) {
+ if (ele == undefined) return;
+ ele.style.display = '';
+}
+
+function hideEle(ele) {
+ if (ele == undefined) return;
+ ele.style.display = 'none';
+}
+
+function setToggleLabel(ele, expandAll) {
+ ele.innerHTML = (expandAll) ? 'Collapse all methods' : 'Expand all methods';
+}
+
+function swapExpand(ele) {
+ replaceClass(ele, /aui-iconfont-collapsed/, 'aui-iconfont-expanded');
+}
+
+function swapCollapse(ele) {
+ replaceClass(ele, /aui-iconfont-expanded/, 'aui-iconfont-collapsed');
+}
+
+function swapExpandImg(ele) {
+ replaceImg(ele, /aui-iconfont-arrows-left/, 'aui-iconfont-arrows-right');
+}
+
+function swapCollapseImg(ele) {
+ replaceImg(ele, /aui-iconfont-arrows-right/, 'aui-iconfont-arrows-left');
+}
+
+var coveredByRegExp = /\b(coveredBy.*)\b/; // matches one of the *coveredBy* classes: ~Test, ~TestUniq, ~FailedTest
+var srcLineHilight = /\bsrcLineHilight\b/; // matches already hilighted src lines
+
+// adds the appropriate coverage class to the given element
+// testInfo must be a LineTestInfo, and is used to calculate the coverage class to use
+function addCoverageClass(ele, testInfo) {
+ if (testInfo != null && !ele.className.match(srcLineHilight)) { // if line already hilighted, nothing to do
+ var coverageClass = testInfo.calcCoverageClass();
+ var matchArray = coveredByRegExp.exec(ele.className);
+ if(matchArray && matchArray.length > 0) { // replace the existing coveredBy class
+ replaceClass(ele, coveredByRegExp, coverageClass);
+ } else { // add a coveredBy class to the existing className
+ ele.className = ele.className + ' ' + testInfo.calcCoverageClass();
+ }
+ }
+}
+// removes the coverageBy class from the existing element
+function removeCoverageClass(ele, testInfo) {
+ if (testInfo != null && ele.className.match(coveredByRegExp)) { // do nothing if no coveredBy class
+ replaceClass(ele, coveredByRegExp, '');
+ }
+}
+
+function replaceClass(ele, regex, newClass) {
+ ele.className = ele.className.replace(regex, newClass);
+}
+function replaceImg(ele, regex, newClass) {
+ ele.src = ele.src.replace(regex, newClass);
+}
+
+
+function createTreeMap(json) {
+
+ // our own colour interpolation - see also ReportColors.ADG_HEAT_COLORS, as colours should match (moreless)
+ TM.Squarified.implement({
+ 'setColor': function (json) {
+ var x = (json.data.$color - 0);
+ if (x > 80) {
+ var alpha = 0.75 - 0.50 * (x - 80.0)/20.0;
+ return "rgba(20,137,44," + alpha + ")"; // ADG green 75%-25%
+ } else if (x > 60) {
+ var alpha = 0.75 - 0.50 * (x - 60.0)/20.0;
+ return "rgba(246,195,66," + alpha + ")"; // ADG yellow 75%-25%
+ } else {
+ var alpha = 0.75 - 0.50 * x/60.0;
+ return "rgba(208,68,55," + alpha + ")"; // ADG red 75%-25%
+ }
+ }
+ });
+
+ return new TM.Squarified({
+ //Where to inject the Treemap
+ rootId: 'infovis',
+ offset: 1,
+ titleHeight: 14,
+
+ //Add click handlers for
+ //zooming the Treemap in and out
+ addLeftClickHandler: true,
+ addRightClickHandler: true,
+
+ //When hovering a node highlight the nodes
+ //between the root node and the hovered node. This
+ //is done by adding the 'in-path' CSS class to each node.
+ selectPathOnHover: true,
+
+ Color: {
+ //Allow coloring
+ allow: true,
+ //Select a value range for the $color
+ //property. Default's to -100 and 100.
+ minValue: 0,
+ maxValue: 100,
+ //Set color range. Default's to reddish and
+ //greenish. It takes an array of three
+ //integers as R, G and B values.
+ maxColorValue: [241, 227, 226], // adg red 10%, light gray 90%
+ minColorValue: [208, 68, 55] // adg red 100%
+ },
+
+ //Allow tips
+ Tips: {
+ allow: true,
+ //add positioning offsets
+ offsetX: 20,
+ offsetY: 20,
+ //implement the onShow method to
+ //add content to the tooltip when a node
+ //is hovered
+ onShow: function(tip, node, isLeaf, domElement) {
+ tip.innerHTML = node.data.title;
+
+ }}
+ ,
+ // This method is called on each newly created node.
+ onCreateElement: function(content, node, isLeaf, elem1, elem2) {
+ if (isLeaf) {
+ elem1.innerHTML = "";
+ }
+ },
+
+ // Called for each click to a node.
+ request: function(nodeId, level, onComplete) {
+ var tree = eval(json);
+ var subtree = TreeUtil.getSubtree(tree, nodeId);
+ TreeUtil.prune(subtree, 1);
+ if (level < 3) { // Leaves are level 3
+ onComplete.onComplete(nodeId, subtree);
+ } else {
+ window.location = subtree.data.path;
+ }
+ }
+
+ });
+
+}
+
+function processTreeMapJson(json) {
+ var tm = createTreeMap(json);
+ //load JSON data
+ tm.loadJSON(json);
+
+}
+
+function processTreeMapDashJson(json) {
+ var tm = createTreeMap(json);
+
+ // customize treemap for the dashboard.
+ tm.config.titleHeight = 0;
+ tm.config.onCreateElement = function(content, node, isLeaf, elem1, elem2) { };
+ // Called for each click to a node.
+ tm.config.request = function(nodeId, level, onComplete) {
+ window.location = "treemap.html";
+ };
+
+ //load JSON data
+ tm.loadJSON(json);
+
+}
\ No newline at end of file
diff --git a/test-coverage/1.0.0/clover.xml b/test-coverage/1.0.0/clover.xml
new file mode 100644
index 0000000..163e0c4
--- /dev/null
+++ b/test-coverage/1.0.0/clover.xml
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/clover/index.html b/test-coverage/1.0.0/clover/index.html
new file mode 100644
index 0000000..e3ed896
--- /dev/null
+++ b/test-coverage/1.0.0/clover/index.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zuletzt Publiziert: 2017-09-09
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test-coverage/1.0.0/dashboard.html b/test-coverage/1.0.0/dashboard.html
new file mode 100644
index 0000000..21d5ce7
--- /dev/null
+++ b/test-coverage/1.0.0/dashboard.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/img/ajax-loader.gif b/test-coverage/1.0.0/img/ajax-loader.gif
new file mode 100644
index 0000000..35028af
Binary files /dev/null and b/test-coverage/1.0.0/img/ajax-loader.gif differ
diff --git a/test-coverage/1.0.0/img/back.gif b/test-coverage/1.0.0/img/back.gif
new file mode 100644
index 0000000..96c3622
Binary files /dev/null and b/test-coverage/1.0.0/img/back.gif differ
diff --git a/test-coverage/1.0.0/img/classComplexityChart.png b/test-coverage/1.0.0/img/classComplexityChart.png
new file mode 100644
index 0000000..3e99d2e
Binary files /dev/null and b/test-coverage/1.0.0/img/classComplexityChart.png differ
diff --git a/test-coverage/1.0.0/img/classDistrubutionChart.png b/test-coverage/1.0.0/img/classDistrubutionChart.png
new file mode 100644
index 0000000..ae25245
Binary files /dev/null and b/test-coverage/1.0.0/img/classDistrubutionChart.png differ
diff --git a/test-coverage/1.0.0/img/clover.ico b/test-coverage/1.0.0/img/clover.ico
new file mode 100644
index 0000000..d933875
Binary files /dev/null and b/test-coverage/1.0.0/img/clover.ico differ
diff --git a/test-coverage/1.0.0/img/clover_logo_large.png b/test-coverage/1.0.0/img/clover_logo_large.png
new file mode 100644
index 0000000..75f41cd
Binary files /dev/null and b/test-coverage/1.0.0/img/clover_logo_large.png differ
diff --git a/test-coverage/1.0.0/img/collapse.gif b/test-coverage/1.0.0/img/collapse.gif
new file mode 100644
index 0000000..c604306
Binary files /dev/null and b/test-coverage/1.0.0/img/collapse.gif differ
diff --git a/test-coverage/1.0.0/img/expand.gif b/test-coverage/1.0.0/img/expand.gif
new file mode 100644
index 0000000..41c9611
Binary files /dev/null and b/test-coverage/1.0.0/img/expand.gif differ
diff --git a/test-coverage/1.0.0/img/failure_gutter.gif b/test-coverage/1.0.0/img/failure_gutter.gif
new file mode 100644
index 0000000..1778cfa
Binary files /dev/null and b/test-coverage/1.0.0/img/failure_gutter.gif differ
diff --git a/test-coverage/1.0.0/img/logo.gif b/test-coverage/1.0.0/img/logo.gif
new file mode 100644
index 0000000..64ab7f2
Binary files /dev/null and b/test-coverage/1.0.0/img/logo.gif differ
diff --git a/test-coverage/1.0.0/img/spacer.gif b/test-coverage/1.0.0/img/spacer.gif
new file mode 100644
index 0000000..07d04f2
Binary files /dev/null and b/test-coverage/1.0.0/img/spacer.gif differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart0.png b/test-coverage/1.0.0/img/srcFileCovDistChart0.png
new file mode 100644
index 0000000..655365b
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart0.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart1.png b/test-coverage/1.0.0/img/srcFileCovDistChart1.png
new file mode 100644
index 0000000..2b00656
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart1.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart10.png b/test-coverage/1.0.0/img/srcFileCovDistChart10.png
new file mode 100644
index 0000000..f274fd1
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart10.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart2.png b/test-coverage/1.0.0/img/srcFileCovDistChart2.png
new file mode 100644
index 0000000..12e5490
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart2.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart3.png b/test-coverage/1.0.0/img/srcFileCovDistChart3.png
new file mode 100644
index 0000000..d4971d4
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart3.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart4.png b/test-coverage/1.0.0/img/srcFileCovDistChart4.png
new file mode 100644
index 0000000..e517050
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart4.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart5.png b/test-coverage/1.0.0/img/srcFileCovDistChart5.png
new file mode 100644
index 0000000..78b89d1
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart5.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart6.png b/test-coverage/1.0.0/img/srcFileCovDistChart6.png
new file mode 100644
index 0000000..e3e44c5
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart6.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart7.png b/test-coverage/1.0.0/img/srcFileCovDistChart7.png
new file mode 100644
index 0000000..46d407a
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart7.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart8.png b/test-coverage/1.0.0/img/srcFileCovDistChart8.png
new file mode 100644
index 0000000..bd1a64e
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart8.png differ
diff --git a/test-coverage/1.0.0/img/srcFileCovDistChart9.png b/test-coverage/1.0.0/img/srcFileCovDistChart9.png
new file mode 100644
index 0000000..71e3a64
Binary files /dev/null and b/test-coverage/1.0.0/img/srcFileCovDistChart9.png differ
diff --git a/test-coverage/1.0.0/img/treemap.gif b/test-coverage/1.0.0/img/treemap.gif
new file mode 100644
index 0000000..9eb3ec4
Binary files /dev/null and b/test-coverage/1.0.0/img/treemap.gif differ
diff --git a/test-coverage/1.0.0/index.html b/test-coverage/1.0.0/index.html
new file mode 100644
index 0000000..8fbb6e4
--- /dev/null
+++ b/test-coverage/1.0.0/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/GetterSetterValidator.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/GetterSetterValidator.html
new file mode 100644
index 0000000..29a5f02
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/GetterSetterValidator.html
@@ -0,0 +1,829 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+ File GetterSetterValidator.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ GetterSetterValidator
+
+32
+ 1
+ 0%
+ 1
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 2 tests.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger ;
+
+
+25
+
+
+
+
+26
+
+import com.openpojo.reflection.impl.PojoClassFactory;
+
+
+27
+
+import com.openpojo.validation.Validator;
+
+
+28
+
+import com.openpojo.validation.ValidatorBuilder;
+
+
+29
+
+import com.openpojo.validation.test.impl.GetterTester;
+
+
+30
+
+import com.openpojo.validation.test.impl.SetterTester;
+
+
+31
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (2)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+32
+
+public class GetterSetterValidator {
+
+
+33
+
+
+
+
+34
+
+ private static final Validator ACCESSOR_VALIDATOR = ValidatorBuilder.create()
+
+
+35
+
+ .with(new GetterTester())
+
+
+36
+
+ .with(new SetterTester())
+
+
+37
+
+ .build();
+
+
+38
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+39
+ 2
+ public static void validateAccessors(final Class<?> clazz) { ...
+
+
+40
+ 2
+ ACCESSOR_VALIDATOR.validate(PojoClassFactory.getPojoClass(clazz));
+
+
+41
+
+ }
+
+
+42
+
+
+
+
+43
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/GetterSetterValidator.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/GetterSetterValidator.js
new file mode 100644
index 0000000..18d9fdb
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/GetterSetterValidator.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":43,"id":130,"methods":[{"el":41,"sc":5,"sl":39}],"name":"GetterSetterValidator","sl":32}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_2":{"methods":[{"sl":39}],"name":"testPojoGetterSetter","pass":true,"statements":[{"sl":40}]},"test_7":{"methods":[{"sl":39}],"name":"testPojoGetterSetter","pass":true,"statements":[{"sl":40}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [2, 7], [2, 7], [], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParser.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParser.html
new file mode 100644
index 0000000..227cb74
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParser.html
@@ -0,0 +1,1411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+ File JunitXmlParser.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ JunitXmlParser
+
+46
+ 57
+ 0%
+ 11
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 8 tests.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger ;
+
+
+25
+
+
+
+
+26
+
+import io.codeclou.java.junit.xml.merger .model .TestSuite ;
+
+
+27
+
+import io.codeclou.java.junit.xml.merger .model .TestSuites ;
+
+
+28
+
+import org.apache.commons.cli.*;
+
+
+29
+
+import org.w3c.dom.Document;
+
+
+30
+
+import org.w3c.dom.Node;
+
+
+31
+
+import org.xml.sax.SAXException;
+
+
+32
+
+
+
+
+33
+
+import javax.xml.parsers.DocumentBuilder;
+
+
+34
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+
+35
+
+import javax.xml.parsers.ParserConfigurationException;
+
+
+36
+
+import javax.xml.transform.Result;
+
+
+37
+
+import javax.xml.transform.Source;
+
+
+38
+
+import javax.xml.transform.Transformer;
+
+
+39
+
+import javax.xml.transform.TransformerFactory;
+
+
+40
+
+import javax.xml.transform.dom.DOMSource;
+
+
+41
+
+import javax.xml.transform.stream.StreamResult;
+
+
+42
+
+import java.io.File;
+
+
+43
+
+import java.io.FileOutputStream;
+
+
+44
+
+import java.io.IOException;
+
+
+45
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (74)
+ Complexity: 11
+ Complexity Density: 0,19
+
+
+
+
+
+46
+
+public class JunitXmlParser {
+
+
+47
+
+
+
+
+48
+
+ private CommandLineParser parser = new DefaultParser();
+
+
+49
+
+ private Options options = new Options();
+
+
+50
+
+ private Boolean hasCmdLineParameterErrors = false ;
+
+
+51
+
+ private Boolean hasFileNotFoundErrors = false ;
+
+
+52
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (4)
+ Complexity: 1
+ Complexity Density: 0,25
+
+
+
+
+
+53
+ 3
+ protected TestSuite parseTestSuite(File filename) throws ParserConfigurationException, SAXException, IOException { ...
+
+
+54
+ 3
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+
+55
+ 3
+ DocumentBuilder builder = factory.newDocumentBuilder();
+
+
+56
+ 3
+ Document document = builder.parse(filename);
+
+
+57
+ 3
+ return transform(document.getFirstChild());
+
+
+58
+
+ }
+
+
+59
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (9)
+ Complexity: 1
+ Complexity Density: 0,11
+
+
+
+
+
+60
+ 5
+ public TestSuite transform(Node testSuite) { ...
+
+
+61
+ 5
+ TestSuite t = new TestSuite ();
+
+
+62
+ 5
+ t.setTests(Long.valueOf(testSuite.getAttributes().getNamedItem("tests" ).getNodeValue()));
+
+
+63
+ 5
+ t.setErrors(Long.valueOf(testSuite.getAttributes().getNamedItem("errors" ).getNodeValue()));
+
+
+64
+ 5
+ t.setFailures(Long.valueOf(testSuite.getAttributes().getNamedItem("failures" ).getNodeValue()));
+
+
+65
+ 5
+ t.setSkipped(Long.valueOf(testSuite.getAttributes().getNamedItem("skipped" ).getNodeValue()));
+
+
+66
+ 5
+ t.setName(testSuite.getAttributes().getNamedItem("name" ).getNodeValue());
+
+
+67
+ 5
+ t.setTime(Double.valueOf(testSuite.getAttributes().getNamedItem("time" ).getNodeValue()));
+
+
+68
+ 5
+ t.setXml(testSuite);
+
+
+69
+ 5
+ return t;
+
+
+70
+
+ }
+
+
+71
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (58)
+ Complexity: 9
+ Complexity Density: 0,2
+
+
+
+
+
+72
+ 6
+ protected void run(String[] args) throws Exception { ...
+
+
+73
+ 6
+ Option option = new Option("i" , "inputDir" , true , "input dir that contains xml files" );
+
+
+74
+ 6
+ options.addOption(option);
+
+
+75
+ 6
+ options.addOption("o" , "output" , true , "output xml file" );
+
+
+76
+ 6
+ options.addOption("s" , "suiteName" , true , "suite name" );
+
+
+77
+ 6
+ CommandLine cmd = this .parser.parse(options, args);
+
+
+78
+ 6
+ System.out.println("\033[32;1;2m+-------------------------+\033[0m" );
+
+
+79
+ 6
+ System.out.println("\033[32;1;2m| Java Junit Xml Merger |\033[0m" );
+
+
+80
+ 6
+ System.out.println("\033[32;1;2m+-------------------------+\033[0m" );
+
+
+81
+ 6
+ if (!cmd.hasOption("inputDir" )) {
+
+
+82
+ 1
+ System.out.println("\033[31;1mError >> Please specify inputDir with -i\033[0m" );
+
+
+83
+ 1
+ hasCmdLineParameterErrors = true ;
+
+
+84
+
+ }
+
+
+85
+ 6
+ if (!cmd.hasOption("output" )) {
+
+
+86
+ 2
+ System.out.println("\033[31;1mError >> Please specify output with -o\033[0m" );
+
+
+87
+ 2
+ hasCmdLineParameterErrors = true ;
+
+
+88
+
+ }
+
+
+89
+ 6
+ if (!cmd.hasOption("suiteName" )) {
+
+
+90
+ 3
+ System.out.println("\033[31;1mError >> Please specify suiteName with -s\033[0m" );
+
+
+91
+ 3
+ hasCmdLineParameterErrors = true ;
+
+
+92
+
+ }
+
+
+93
+ 6
+ if (!hasCmdLineParameterErrors) {
+
+
+94
+ 3
+ System.out.println("\033[32;1;2mSuccess >> All input parameters ok\033[0m" );
+
+
+95
+ 3
+ File outputFile = new File(cmd.getOptionValue("output" ));
+
+
+96
+ 3
+ File inputFileDir = new File(cmd.getOptionValue("inputDir" ));
+
+
+97
+ 3
+ try {
+
+
+98
+
+
+
+
+99
+ 3
+ new FileOutputStream(outputFile).close();
+
+
+100
+
+ } catch (IOException e) {
+
+
+101
+ 1
+ hasFileNotFoundErrors = true ;
+
+
+102
+ 1
+ System.out.println("\033[31;1mError >> Outputfile not writeable\033[0m" );
+
+
+103
+ 1
+ System.out.println(outputFile.getAbsolutePath());
+
+
+104
+
+ }
+
+
+105
+ 3
+ if (!inputFileDir.isDirectory()) {
+
+
+106
+ 1
+ hasFileNotFoundErrors = true ;
+
+
+107
+ 1
+ System.out.println("\033[31;1mError >> Input dir not readable\033[0m" );
+
+
+108
+ 1
+ System.out.println(inputFileDir.getAbsolutePath());
+
+
+109
+
+ }
+
+
+110
+ 3
+ if (!hasFileNotFoundErrors) {
+
+
+111
+ 2
+ System.out.println("\033[32;1;2mSuccess >> All files and folders ok\033[0m" );
+
+
+112
+ 2
+ TestSuites suites = new TestSuites ();
+
+
+113
+ 2
+ suites.setName(cmd.getOptionValue("suiteName" ));
+
+
+114
+ 2
+ File[] filesList = inputFileDir.listFiles();
+
+
+115
+ 2
+ for (File f : filesList) {
+
+
+116
+ 3
+ if (f.getAbsoluteFile().toString().endsWith(".xml" )) {
+
+
+117
+ 2
+ System.out.println("\033[32;1;2mInfo >> adding " + f.getName() + " to TestSuites\033[0m" );
+
+
+118
+ 2
+ suites.getTestSuites().add(parseTestSuite(f));
+
+
+119
+
+ }
+
+
+120
+
+ }
+
+
+121
+ 2
+ Document xml = suites.toXml();
+
+
+122
+ 2
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+
+
+123
+ 2
+ Result output = new StreamResult(outputFile);
+
+
+124
+ 2
+ Source input = new DOMSource(xml);
+
+
+125
+ 2
+ transformer.transform(input, output);
+
+
+126
+
+ }
+
+
+127
+
+ }
+
+
+128
+
+ }
+
+
+129
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParser.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParser.js
new file mode 100644
index 0000000..cdc15c4
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParser.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":129,"id":0,"methods":[{"el":58,"sc":5,"sl":53},{"el":70,"sc":5,"sl":60},{"el":128,"sc":5,"sl":72}],"name":"JunitXmlParser","sl":46}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_0":{"methods":[{"sl":53},{"sl":60},{"sl":72}],"name":"testRunValidInputWithValidFolders","pass":true,"statements":[{"sl":54},{"sl":55},{"sl":56},{"sl":57},{"sl":61},{"sl":62},{"sl":63},{"sl":64},{"sl":65},{"sl":66},{"sl":67},{"sl":68},{"sl":69},{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":85},{"sl":89},{"sl":93},{"sl":94},{"sl":95},{"sl":96},{"sl":97},{"sl":99},{"sl":105},{"sl":110},{"sl":111},{"sl":112},{"sl":113},{"sl":114},{"sl":115},{"sl":116},{"sl":117},{"sl":118},{"sl":121},{"sl":122},{"sl":123},{"sl":124},{"sl":125}]},"test_1":{"methods":[{"sl":72}],"name":"testRunInvalidInput1","pass":true,"statements":[{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":82},{"sl":83},{"sl":85},{"sl":86},{"sl":87},{"sl":89},{"sl":90},{"sl":91},{"sl":93}]},"test_10":{"methods":[{"sl":72}],"name":"testRunValidInputWithEmptyInputFolder","pass":true,"statements":[{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":85},{"sl":89},{"sl":93},{"sl":94},{"sl":95},{"sl":96},{"sl":97},{"sl":99},{"sl":105},{"sl":110},{"sl":111},{"sl":112},{"sl":113},{"sl":114},{"sl":115},{"sl":121},{"sl":122},{"sl":123},{"sl":124},{"sl":125}]},"test_3":{"methods":[{"sl":53},{"sl":60}],"name":"testParse","pass":true,"statements":[{"sl":54},{"sl":55},{"sl":56},{"sl":57},{"sl":61},{"sl":62},{"sl":63},{"sl":64},{"sl":65},{"sl":66},{"sl":67},{"sl":68},{"sl":69}]},"test_4":{"methods":[{"sl":72}],"name":"testRunValidInputWithInvalidFolders","pass":true,"statements":[{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":85},{"sl":89},{"sl":93},{"sl":94},{"sl":95},{"sl":96},{"sl":97},{"sl":99},{"sl":101},{"sl":102},{"sl":103},{"sl":105},{"sl":106},{"sl":107},{"sl":108},{"sl":110}]},"test_5":{"methods":[{"sl":72}],"name":"testRunInvalidInput3","pass":true,"statements":[{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":85},{"sl":89},{"sl":90},{"sl":91},{"sl":93}]},"test_6":{"methods":[{"sl":72}],"name":"testRunInvalidInput2","pass":true,"statements":[{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":85},{"sl":86},{"sl":87},{"sl":89},{"sl":90},{"sl":91},{"sl":93}]},"test_8":{"methods":[{"sl":60}],"name":"testToXml","pass":true,"statements":[{"sl":61},{"sl":62},{"sl":63},{"sl":64},{"sl":65},{"sl":66},{"sl":67},{"sl":68},{"sl":69}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [0, 3], [0, 3], [0, 3], [0, 3], [0, 3], [], [], [0, 3, 8], [0, 3, 8], [0, 3, 8], [0, 3, 8], [0, 3, 8], [0, 3, 8], [0, 3, 8], [0, 3, 8], [0, 3, 8], [0, 3, 8], [], [], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [5, 1, 0, 6, 4, 10], [1], [1], [], [5, 1, 0, 6, 4, 10], [1, 6], [1, 6], [], [5, 1, 0, 6, 4, 10], [5, 1, 6], [5, 1, 6], [], [5, 1, 0, 6, 4, 10], [0, 4, 10], [0, 4, 10], [0, 4, 10], [0, 4, 10], [], [0, 4, 10], [], [4], [4], [4], [], [0, 4, 10], [4], [4], [4], [], [0, 4, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0], [0], [0], [], [], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [], [], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.html
new file mode 100644
index 0000000..65b513d
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.html
@@ -0,0 +1,1460 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+ File JunitXmlParserTest.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ JunitXmlParserTest
+
+35
+ 48
+ 0%
+ 8
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 7 tests.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger ;
+
+
+25
+
+
+
+
+26
+
+import io.codeclou.java.junit.xml.merger .model .TestSuite ;
+
+
+27
+
+import org.junit.Test;
+
+
+28
+
+import org.mockito.internal.util.reflection.Whitebox;
+
+
+29
+
+
+
+
+30
+
+import java.io.File;
+
+
+31
+
+
+
+
+32
+
+import static junit.framework.TestCase.assertFalse;
+
+
+33
+
+import static org.junit.Assert.*;
+
+
+34
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (56)
+ Complexity: 8
+ Complexity Density: 0,17
+
+
+
+
+
+35
+
+public class JunitXmlParserTest {
+
+
+36
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (2)
+ Complexity: 1
+ Complexity Density: 0,5
+
+
+
+
+
+37
+ 1
+ private File getTestFile(String filename) { ...
+
+
+38
+ 1
+ ClassLoader classLoader = getClass().getClassLoader();
+
+
+39
+ 1
+ return new File(classLoader.getResource(filename).getFile());
+
+
+40
+
+ }
+
+
+41
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (9)
+ Complexity: 1
+ Complexity Density: 0,11
+ 1 PASS
+
+
+
+
+
+
+42
+ 1
+ @Test ...
+
+
+43
+
+ public void testParse() throws Exception {
+
+
+44
+ 1
+ JunitXmlParser parser = new JunitXmlParser ();
+
+
+45
+ 1
+ TestSuite t = parser.parseTestSuite(getTestFile("sort-model-test.xml" ));
+
+
+46
+ 1
+ assertEquals(Long.valueOf(0L), t.getErrors());
+
+
+47
+ 1
+ assertEquals(Long.valueOf(0L), t.getFailures());
+
+
+48
+ 1
+ assertEquals(Long.valueOf(0L), t.getSkipped());
+
+
+49
+ 1
+ assertEquals(Long.valueOf(3L), t.getTests());
+
+
+50
+ 1
+ assertTrue(t.getTime() > 0.028);
+
+
+51
+ 1
+ assertEquals("ut.io.codeclou.customfield.editor.model.rest.SortModelTest" , t.getName());
+
+
+52
+ 1
+ assertNotNull(t.getXml());
+
+
+53
+
+ }
+
+
+54
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (5)
+ Complexity: 1
+ Complexity Density: 0,2
+ 1 PASS
+
+
+
+
+
+
+55
+ 1
+ @Test ...
+
+
+56
+
+ public void testRunInvalidInput1() throws Exception {
+
+
+57
+ 1
+ String[] args = {};
+
+
+58
+ 1
+ JunitXmlParser parser = new JunitXmlParser ();
+
+
+59
+ 1
+ parser.run(args);
+
+
+60
+ 1
+ Boolean hasCmdLineParameterErrors = (Boolean) Whitebox.getInternalState(parser, "hasCmdLineParameterErrors" );
+
+
+61
+ 1
+ assertTrue(hasCmdLineParameterErrors);
+
+
+62
+
+ }
+
+
+63
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (5)
+ Complexity: 1
+ Complexity Density: 0,2
+ 1 PASS
+
+
+
+
+
+
+64
+ 1
+ @Test ...
+
+
+65
+
+ public void testRunInvalidInput2() throws Exception {
+
+
+66
+ 1
+ String[] args = {"-i=foo" };
+
+
+67
+ 1
+ JunitXmlParser parser = new JunitXmlParser ();
+
+
+68
+ 1
+ parser.run(args);
+
+
+69
+ 1
+ Boolean hasCmdLineParameterErrors = (Boolean) Whitebox.getInternalState(parser, "hasCmdLineParameterErrors" );
+
+
+70
+ 1
+ assertTrue(hasCmdLineParameterErrors);
+
+
+71
+
+ }
+
+
+72
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (5)
+ Complexity: 1
+ Complexity Density: 0,2
+ 1 PASS
+
+
+
+
+
+
+73
+ 1
+ @Test ...
+
+
+74
+
+ public void testRunInvalidInput3() throws Exception {
+
+
+75
+ 1
+ String[] args = {"-i=foo" , "-o=bar.xml" };
+
+
+76
+ 1
+ JunitXmlParser parser = new JunitXmlParser ();
+
+
+77
+ 1
+ parser.run(args);
+
+
+78
+ 1
+ Boolean hasCmdLineParameterErrors = (Boolean) Whitebox.getInternalState(parser, "hasCmdLineParameterErrors" );
+
+
+79
+ 1
+ assertTrue(hasCmdLineParameterErrors);
+
+
+80
+
+ }
+
+
+81
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (5)
+ Complexity: 1
+ Complexity Density: 0,2
+ 1 PASS
+
+
+
+
+
+
+82
+ 1
+ @Test ...
+
+
+83
+
+ public void testRunValidInputWithInvalidFolders() throws Exception {
+
+
+84
+ 1
+ String[] args = {"-i=foo" , "-o=?x/bar.xml" , "-s=foo" };
+
+
+85
+ 1
+ JunitXmlParser parser = new JunitXmlParser ();
+
+
+86
+ 1
+ parser.run(args);
+
+
+87
+ 1
+ Boolean hasFileNotFoundErrors = (Boolean) Whitebox.getInternalState(parser, "hasFileNotFoundErrors" );
+
+
+88
+ 1
+ assertTrue(hasFileNotFoundErrors);
+
+
+89
+
+ }
+
+
+90
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (7)
+ Complexity: 1
+ Complexity Density: 0,14
+ 1 PASS
+
+
+
+
+
+
+91
+ 1
+ @Test ...
+
+
+92
+
+ public void testRunValidInputWithValidFolders() throws Exception {
+
+
+93
+ 1
+ String[] args = {"-i=src/test/resources/" , "-o=output.xml" , "-s=foo bar" };
+
+
+94
+ 1
+ JunitXmlParser parser = new JunitXmlParser ();
+
+
+95
+ 1
+ parser.run(args);
+
+
+96
+ 1
+ Boolean hasCmdLineParameterErrors = (Boolean) Whitebox.getInternalState(parser, "hasCmdLineParameterErrors" );
+
+
+97
+ 1
+ assertFalse(hasCmdLineParameterErrors);
+
+
+98
+ 1
+ Boolean hasFileNotFoundErrors = (Boolean) Whitebox.getInternalState(parser, "hasFileNotFoundErrors" );
+
+
+99
+ 1
+ assertFalse(hasFileNotFoundErrors);
+
+
+100
+
+ }
+
+
+101
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (10)
+ Complexity: 1
+ Complexity Density: 0,1
+ 1 PASS
+
+
+
+
+
+
+102
+ 1
+ @Test ...
+
+
+103
+
+ public void testRunValidInputWithEmptyInputFolder() throws Exception {
+
+
+104
+ 1
+ File emptyDir = new File("src/test/resources/empty/" );
+
+
+105
+ 1
+ emptyDir.mkdir();
+
+
+106
+ 1
+ String[] args = {"-i=src/test/resources/empty/" , "-o=output.xml" , "-s=foo bar" };
+
+
+107
+ 1
+ JunitXmlParser parser = new JunitXmlParser ();
+
+
+108
+ 1
+ parser.run(args);
+
+
+109
+ 1
+ Boolean hasCmdLineParameterErrors = (Boolean) Whitebox.getInternalState(parser, "hasCmdLineParameterErrors" );
+
+
+110
+ 1
+ assertFalse(hasCmdLineParameterErrors);
+
+
+111
+ 1
+ Boolean hasFileNotFoundErrors = (Boolean) Whitebox.getInternalState(parser, "hasFileNotFoundErrors" );
+
+
+112
+ 1
+ assertFalse(hasFileNotFoundErrors);
+
+
+113
+ 1
+ emptyDir.delete();
+
+
+114
+
+ }
+
+
+115
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.js
new file mode 100644
index 0000000..bbde8e7
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":115,"id":132,"methods":[{"el":40,"sc":5,"sl":37},{"el":53,"sc":5,"sl":42},{"el":62,"sc":5,"sl":55},{"el":71,"sc":5,"sl":64},{"el":80,"sc":5,"sl":73},{"el":89,"sc":5,"sl":82},{"el":100,"sc":5,"sl":91},{"el":114,"sc":5,"sl":102}],"name":"JunitXmlParserTest","sl":35}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_0":{"methods":[{"sl":91}],"name":"testRunValidInputWithValidFolders","pass":true,"statements":[{"sl":93},{"sl":94},{"sl":95},{"sl":96},{"sl":97},{"sl":98},{"sl":99}]},"test_1":{"methods":[{"sl":55}],"name":"testRunInvalidInput1","pass":true,"statements":[{"sl":57},{"sl":58},{"sl":59},{"sl":60},{"sl":61}]},"test_10":{"methods":[{"sl":102}],"name":"testRunValidInputWithEmptyInputFolder","pass":true,"statements":[{"sl":104},{"sl":105},{"sl":106},{"sl":107},{"sl":108},{"sl":109},{"sl":110},{"sl":111},{"sl":112},{"sl":113}]},"test_3":{"methods":[{"sl":37},{"sl":42}],"name":"testParse","pass":true,"statements":[{"sl":38},{"sl":39},{"sl":44},{"sl":45},{"sl":46},{"sl":47},{"sl":48},{"sl":49},{"sl":50},{"sl":51},{"sl":52}]},"test_4":{"methods":[{"sl":82}],"name":"testRunValidInputWithInvalidFolders","pass":true,"statements":[{"sl":84},{"sl":85},{"sl":86},{"sl":87},{"sl":88}]},"test_5":{"methods":[{"sl":73}],"name":"testRunInvalidInput3","pass":true,"statements":[{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79}]},"test_6":{"methods":[{"sl":64}],"name":"testRunInvalidInput2","pass":true,"statements":[{"sl":66},{"sl":67},{"sl":68},{"sl":69},{"sl":70}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [3], [3], [3], [], [], [3], [], [3], [3], [3], [3], [3], [3], [3], [3], [3], [], [], [1], [], [1], [1], [1], [1], [1], [], [], [6], [], [6], [6], [6], [6], [6], [], [], [5], [], [5], [5], [5], [5], [5], [], [], [4], [], [4], [4], [4], [4], [4], [], [], [0], [], [0], [0], [0], [0], [0], [0], [0], [], [], [10], [], [10], [10], [10], [10], [10], [10], [10], [10], [10], [10], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testParse_3.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testParse_3.html
new file mode 100644
index 0000000..65a14ec
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testParse_3.html
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testParse
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testParse
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:21
+
+
+ 0.07
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput1_1.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput1_1.html
new file mode 100644
index 0000000..884ddd7
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput1_1.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testRunInvalidInput1
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testRunInvalidInput1
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:21
+
+
+ 0.004
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput2_6.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput2_6.html
new file mode 100644
index 0000000..fff6c75
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput2_6.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testRunInvalidInput2
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testRunInvalidInput2
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:21
+
+
+ 0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput3_5.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput3_5.html
new file mode 100644
index 0000000..afb116d
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunInvalidInput3_5.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testRunInvalidInput3
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testRunInvalidInput3
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:21
+
+
+ 0.001
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithEmptyInputFolder_a.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithEmptyInputFolder_a.html
new file mode 100644
index 0000000..c5b43e0
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithEmptyInputFolder_a.html
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testRunValidInputWithEmptyInputFolder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithInvalidFolders_4.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithInvalidFolders_4.html
new file mode 100644
index 0000000..348d2c9
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithInvalidFolders_4.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testRunValidInputWithInvalidFolders
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithValidFolders_0.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithValidFolders_0.html
new file mode 100644
index 0000000..e8e9f87
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/JunitXmlParserTest_testRunValidInputWithValidFolders_0.html
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testRunValidInputWithValidFolders
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/Merger.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/Merger.html
new file mode 100644
index 0000000..cb680b9
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/Merger.html
@@ -0,0 +1,763 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+ File Merger.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ Merger
+
+26
+ 2
+ 0%
+ 1
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class Merger
+
+Line # 26
+ Total Statements 2
+ % Filtered 0%
+ Complexity 1
+ Uncovered Elements 0
+ TOTAL Coverage
+
+
+
+
+ main(String[]) : void
+ main(String[]) : void
+
+28 28
+2.0 2
+0.0 0%
+1.0 1
+0.0 0
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 1 test.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger ;
+
+
+25
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (3)
+ Complexity: 1
+ Complexity Density: 0,5
+
+
+
+
+
+26
+
+public class Merger {
+
+
+27
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (2)
+ Complexity: 1
+ Complexity Density: 0,5
+
+
+
+
+
+28
+ 1
+ public static void main(String [] args) throws Exception { ...
+
+
+29
+ 1
+ JunitXmlParser junitXmlParser = new JunitXmlParser ();
+
+
+30
+ 1
+ junitXmlParser.run(args);
+
+
+31
+
+ }
+
+
+32
+
+
+
+
+33
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/Merger.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/Merger.js
new file mode 100644
index 0000000..c538f75
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/Merger.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":33,"id":74,"methods":[{"el":31,"sc":5,"sl":28}],"name":"Merger","sl":26}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_9":{"methods":[{"sl":28}],"name":"testMergerValidInput","pass":true,"statements":[{"sl":29},{"sl":30}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [9], [9], [9], [], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest.html
new file mode 100644
index 0000000..b98347e
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest.html
@@ -0,0 +1,869 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+ File MergerTest.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ MergerTest
+
+36
+ 3
+ 0%
+ 2
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class MergerTest
+
+Line # 36
+ Total Statements 3
+ % Filtered 0%
+ Complexity 2
+ Uncovered Elements 0
+ TOTAL Coverage
+
+
+
+
+ init() : void
+ init() : void
+
+41 41
+1.0 1
+0.0 0%
+1.0 1
+0.0 0
+1.0
+
+
+ testMergerValidInput() : void
+ testMergerValidInput() : void
+
+46 46
+2.0 2
+0.0 0%
+1.0 1
+0.0 0
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 1 test.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger ;
+
+
+25
+
+
+
+
+26
+
+import org.junit.Before;
+
+
+27
+
+import org.junit.Test;
+
+
+28
+
+import org.junit.runner.RunWith;
+
+
+29
+
+import org.mockito.Mock;
+
+
+30
+
+import org.powermock.core.classloader.annotations.PrepareForTest;
+
+
+31
+
+import org.powermock.modules.junit4.PowerMockRunner;
+
+
+32
+
+
+
+
+33
+
+import static org.powermock.api.mockito.PowerMockito.whenNew;
+
+
+34
+
+
+
+
+35
+
+@RunWith(PowerMockRunner.class )
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (5)
+ Complexity: 2
+ Complexity Density: 0,67
+
+
+
+
+
+36
+
+public class MergerTest {
+
+
+37
+
+
+
+
+38
+
+ @Mock
+
+
+39
+
+ private JunitXmlParser junitXmlParser;
+
+
+40
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+41
+ 1
+ @Before ...
+
+
+42
+
+ public void init() throws Exception {
+
+
+43
+ 1
+ whenNew(JunitXmlParser .class ).withNoArguments().thenReturn(junitXmlParser);
+
+
+44
+
+ }
+
+
+45
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (2)
+ Complexity: 1
+ Complexity Density: 0,5
+ 1 PASS
+
+
+
+
+
+
+46
+ 1
+ @Test ...
+
+
+47
+
+ @PrepareForTest({Merger .class })
+
+
+48
+
+ public void testMergerValidInput() throws Exception {
+
+
+49
+ 1
+ String[] args = {"-i foo" , "-i bar" };
+
+
+50
+ 1
+ Merger .main(args);
+
+
+51
+
+ }
+
+
+52
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest.js
new file mode 100644
index 0000000..6587848
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":52,"id":188,"methods":[{"el":44,"sc":5,"sl":41},{"el":51,"sc":5,"sl":46}],"name":"MergerTest","sl":36}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_9":{"methods":[{"sl":46}],"name":"testMergerValidInput","pass":true,"statements":[{"sl":49},{"sl":50}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [9], [], [], [9], [9], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest_testMergerValidInput_9.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest_testMergerValidInput_9.html
new file mode 100644
index 0000000..abe3a2b
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/MergerTest_testMergerValidInput_9.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testMergerValidInput
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testMergerValidInput
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:22
+
+
+ 0.044
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuite.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuite.html
new file mode 100644
index 0000000..b922d11
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuite.html
@@ -0,0 +1,1480 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+ File TestSuite.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ TestSuite
+
+28
+ 14
+ 0%
+ 14
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 4 tests.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger .model ;
+
+
+25
+
+
+
+
+26
+
+import org.w3c.dom.Node;
+
+
+27
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (28)
+ Complexity: 14
+ Complexity Density: 1
+
+
+
+
+
+28
+
+public class TestSuite {
+
+
+29
+
+
+
+
+30
+
+ private Long tests;
+
+
+31
+
+ private Long failures;
+
+
+32
+
+ private Long errors;
+
+
+33
+
+ private Long skipped;
+
+
+34
+
+ private String name;
+
+
+35
+
+ private Double time;
+
+
+36
+
+
+
+
+37
+
+ private Node xml;
+
+
+38
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+39
+ 8
+ public Long getTests() { ...
+
+
+40
+ 8
+ return tests;
+
+
+41
+
+ }
+
+
+42
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+43
+ 6
+ public void setTests(Long tests) { ...
+
+
+44
+ 6
+ this .tests = tests;
+
+
+45
+
+ }
+
+
+46
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+47
+ 8
+ public Long getFailures() { ...
+
+
+48
+ 8
+ return failures;
+
+
+49
+
+ }
+
+
+50
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+51
+ 6
+ public void setFailures(Long failures) { ...
+
+
+52
+ 6
+ this .failures = failures;
+
+
+53
+
+ }
+
+
+54
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+55
+ 2
+ public Long getErrors() { ...
+
+
+56
+ 2
+ return errors;
+
+
+57
+
+ }
+
+
+58
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+59
+ 6
+ public void setErrors(Long errors) { ...
+
+
+60
+ 6
+ this .errors = errors;
+
+
+61
+
+ }
+
+
+62
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+63
+ 2
+ public Long getSkipped() { ...
+
+
+64
+ 2
+ return skipped;
+
+
+65
+
+ }
+
+
+66
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+67
+ 6
+ public void setSkipped(Long skipped) { ...
+
+
+68
+ 6
+ this .skipped = skipped;
+
+
+69
+
+ }
+
+
+70
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+71
+ 2
+ public String getName() { ...
+
+
+72
+ 2
+ return name;
+
+
+73
+
+ }
+
+
+74
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+75
+ 6
+ public void setName(String name) { ...
+
+
+76
+ 6
+ this .name = name;
+
+
+77
+
+ }
+
+
+78
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+79
+ 8
+ public Double getTime() { ...
+
+
+80
+ 8
+ return time;
+
+
+81
+
+ }
+
+
+82
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+83
+ 6
+ public void setTime(Double time) { ...
+
+
+84
+ 6
+ this .time = time;
+
+
+85
+
+ }
+
+
+86
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+87
+ 6
+ public Node getXml() { ...
+
+
+88
+ 6
+ return xml;
+
+
+89
+
+ }
+
+
+90
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+91
+ 6
+ public void setXml(Node xml) { ...
+
+
+92
+ 6
+ this .xml = xml;
+
+
+93
+
+ }
+
+
+94
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuite.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuite.js
new file mode 100644
index 0000000..42bf377
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuite.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":94,"id":77,"methods":[{"el":41,"sc":5,"sl":39},{"el":45,"sc":5,"sl":43},{"el":49,"sc":5,"sl":47},{"el":53,"sc":5,"sl":51},{"el":57,"sc":5,"sl":55},{"el":61,"sc":5,"sl":59},{"el":65,"sc":5,"sl":63},{"el":69,"sc":5,"sl":67},{"el":73,"sc":5,"sl":71},{"el":77,"sc":5,"sl":75},{"el":81,"sc":5,"sl":79},{"el":85,"sc":5,"sl":83},{"el":89,"sc":5,"sl":87},{"el":93,"sc":5,"sl":91}],"name":"TestSuite","sl":28}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_0":{"methods":[{"sl":39},{"sl":43},{"sl":47},{"sl":51},{"sl":59},{"sl":67},{"sl":75},{"sl":79},{"sl":83},{"sl":87},{"sl":91}],"name":"testRunValidInputWithValidFolders","pass":true,"statements":[{"sl":40},{"sl":44},{"sl":48},{"sl":52},{"sl":60},{"sl":68},{"sl":76},{"sl":80},{"sl":84},{"sl":88},{"sl":92}]},"test_2":{"methods":[{"sl":39},{"sl":43},{"sl":47},{"sl":51},{"sl":55},{"sl":59},{"sl":63},{"sl":67},{"sl":71},{"sl":75},{"sl":79},{"sl":83},{"sl":87},{"sl":91}],"name":"testPojoGetterSetter","pass":true,"statements":[{"sl":40},{"sl":44},{"sl":48},{"sl":52},{"sl":56},{"sl":60},{"sl":64},{"sl":68},{"sl":72},{"sl":76},{"sl":80},{"sl":84},{"sl":88},{"sl":92}]},"test_3":{"methods":[{"sl":39},{"sl":43},{"sl":47},{"sl":51},{"sl":55},{"sl":59},{"sl":63},{"sl":67},{"sl":71},{"sl":75},{"sl":79},{"sl":83},{"sl":87},{"sl":91}],"name":"testParse","pass":true,"statements":[{"sl":40},{"sl":44},{"sl":48},{"sl":52},{"sl":56},{"sl":60},{"sl":64},{"sl":68},{"sl":72},{"sl":76},{"sl":80},{"sl":84},{"sl":88},{"sl":92}]},"test_8":{"methods":[{"sl":39},{"sl":43},{"sl":47},{"sl":51},{"sl":59},{"sl":67},{"sl":75},{"sl":79},{"sl":83},{"sl":87},{"sl":91}],"name":"testToXml","pass":true,"statements":[{"sl":40},{"sl":44},{"sl":48},{"sl":52},{"sl":60},{"sl":68},{"sl":76},{"sl":80},{"sl":84},{"sl":88},{"sl":92}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [2, 3], [2, 3], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [2, 3], [2, 3], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [2, 3], [2, 3], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], [], [0, 2, 3, 8], [0, 2, 3, 8], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest.html
new file mode 100644
index 0000000..2a104d4
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest.html
@@ -0,0 +1,751 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+ File TestSuiteTest.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ TestSuiteTest
+
+29
+ 1
+ 0%
+ 1
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class TestSuiteTest
+
+Line # 29
+ Total Statements 1
+ % Filtered 0%
+ Complexity 1
+ Uncovered Elements 0
+ TOTAL Coverage
+
+
+
+
+ testPojoGetterSetter() : void
+ testPojoGetterSetter() : void
+
+30 30
+1.0 1
+0.0 0%
+1.0 1
+0.0 0
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 1 test.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger .model ;
+
+
+25
+
+
+
+
+26
+
+import io.codeclou.java.junit.xml.merger .GetterSetterValidator ;
+
+
+27
+
+import org.junit.Test;
+
+
+28
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (2)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+29
+
+public class TestSuiteTest {
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+ 1 PASS
+
+
+
+
+
+
+30
+ 1
+ @Test ...
+
+
+31
+
+ public void testPojoGetterSetter() {
+
+
+32
+ 1
+ GetterSetterValidator .validateAccessors(TestSuite .class );
+
+
+33
+
+ }
+
+
+34
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest.js
new file mode 100644
index 0000000..c9d7567
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":34,"id":193,"methods":[{"el":33,"sc":5,"sl":30}],"name":"TestSuiteTest","sl":29}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_2":{"methods":[{"sl":30}],"name":"testPojoGetterSetter","pass":true,"statements":[{"sl":32}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [2], [], [2], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest_testPojoGetterSetter_2.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest_testPojoGetterSetter_2.html
new file mode 100644
index 0000000..9056aef
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuiteTest_testPojoGetterSetter_2.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testPojoGetterSetter
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testPojoGetterSetter
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:22
+
+
+ 0.011
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuites.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuites.html
new file mode 100644
index 0000000..53663bf
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuites.html
@@ -0,0 +1,1244 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+ File TestSuites.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ TestSuites
+
+35
+ 18
+ 0%
+ 7
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 4 tests.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger .model ;
+
+
+25
+
+
+
+
+26
+
+import org.w3c.dom.Document;
+
+
+27
+
+import org.w3c.dom.Element;
+
+
+28
+
+
+
+
+29
+
+import javax.xml.parsers.DocumentBuilder;
+
+
+30
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+
+31
+
+import javax.xml.parsers.ParserConfigurationException;
+
+
+32
+
+import java.util.ArrayList;
+
+
+33
+
+import java.util.List;
+
+
+34
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (25)
+ Complexity: 7
+ Complexity Density: 0,39
+
+
+
+
+
+35
+
+public class TestSuites {
+
+
+36
+
+
+
+
+37
+
+ private String name;
+
+
+38
+
+
+
+
+39
+
+ private List<TestSuite > testSuites = new ArrayList<>();
+
+
+40
+
+
+
+
+41
+
+
+
+
+42
+
+
+
+
+43
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+44
+ 4
+ public Long getTests() { ...
+
+
+45
+ 4
+ return testSuites.stream().mapToLong(t -> t.getTests()).sum();
+
+
+46
+
+ }
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+47
+ 4
+ public Long getFailures() { ...
+
+
+48
+ 4
+ return testSuites.stream().mapToLong(t -> t.getFailures()).sum();
+
+
+49
+
+ }
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+50
+ 4
+ public Double getTime() { ...
+
+
+51
+ 4
+ return testSuites.stream().mapToDouble(t -> t.getTime()).sum();
+
+
+52
+
+ }
+
+
+53
+
+
+
+
+54
+
+
+
+
+55
+
+
+
+
+56
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+57
+ 5
+ public String getName() { ...
+
+
+58
+ 5
+ return name;
+
+
+59
+
+ }
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+60
+ 4
+ public void setName(String name) { ...
+
+
+61
+ 4
+ this .name = name;
+
+
+62
+
+ }
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+
+
+
+
+
+63
+ 5
+ public List<TestSuite > getTestSuites() { ...
+
+
+64
+ 5
+ return testSuites;
+
+
+65
+
+ }
+
+
+66
+
+
+
+
+67
+
+
+
+
+68
+
+
+
+
+69
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (12)
+ Complexity: 1
+ Complexity Density: 0,08
+
+
+
+
+
+70
+ 3
+ public Document toXml() throws ParserConfigurationException { ...
+
+
+71
+ 3
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+
+72
+ 3
+ DocumentBuilder builder = factory.newDocumentBuilder();
+
+
+73
+ 3
+ Document document = builder.newDocument();
+
+
+74
+ 3
+ Element rootEl = document.createElement("testsuites" );
+
+
+75
+ 3
+ document.appendChild(rootEl);
+
+
+76
+ 3
+ rootEl.setAttribute("time" , this .getTime().toString());
+
+
+77
+ 3
+ rootEl.setAttribute("tests" , this .getTests().toString());
+
+
+78
+ 3
+ rootEl.setAttribute("failures" , this .getFailures().toString());
+
+
+79
+ 3
+ rootEl.setAttribute("name" , this .getName());
+
+
+80
+ 3
+ for (TestSuite t : this .testSuites) {
+
+
+81
+ 4
+ rootEl.appendChild(document.importNode(t.getXml(), true ));
+
+
+82
+
+ }
+
+
+83
+ 3
+ return document;
+
+
+84
+
+ }
+
+
+85
+
+
+
+
+86
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuites.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuites.js
new file mode 100644
index 0000000..c1f087c
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuites.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":86,"id":105,"methods":[{"el":46,"sc":5,"sl":44},{"el":49,"sc":5,"sl":47},{"el":52,"sc":5,"sl":50},{"el":59,"sc":5,"sl":57},{"el":62,"sc":5,"sl":60},{"el":65,"sc":5,"sl":63},{"el":84,"sc":5,"sl":70}],"name":"TestSuites","sl":35}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_0":{"methods":[{"sl":44},{"sl":47},{"sl":50},{"sl":57},{"sl":60},{"sl":63},{"sl":70}],"name":"testRunValidInputWithValidFolders","pass":true,"statements":[{"sl":45},{"sl":48},{"sl":51},{"sl":58},{"sl":61},{"sl":64},{"sl":71},{"sl":72},{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":83}]},"test_10":{"methods":[{"sl":44},{"sl":47},{"sl":50},{"sl":57},{"sl":60},{"sl":70}],"name":"testRunValidInputWithEmptyInputFolder","pass":true,"statements":[{"sl":45},{"sl":48},{"sl":51},{"sl":58},{"sl":61},{"sl":71},{"sl":72},{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":83}]},"test_7":{"methods":[{"sl":57},{"sl":60},{"sl":63}],"name":"testPojoGetterSetter","pass":true,"statements":[{"sl":58},{"sl":61},{"sl":64}]},"test_8":{"methods":[{"sl":44},{"sl":47},{"sl":50},{"sl":57},{"sl":60},{"sl":63},{"sl":70}],"name":"testToXml","pass":true,"statements":[{"sl":45},{"sl":48},{"sl":51},{"sl":58},{"sl":61},{"sl":64},{"sl":71},{"sl":72},{"sl":73},{"sl":74},{"sl":75},{"sl":76},{"sl":77},{"sl":78},{"sl":79},{"sl":80},{"sl":81},{"sl":83}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [0, 8, 10], [0, 8, 10], [], [0, 8, 10], [0, 8, 10], [], [0, 8, 10], [0, 8, 10], [], [], [], [], [], [0, 7, 8, 10], [0, 7, 8, 10], [], [0, 7, 8, 10], [0, 7, 8, 10], [], [0, 7, 8], [0, 7, 8], [], [], [], [], [], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8, 10], [0, 8], [], [0, 8, 10], [], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.html
new file mode 100644
index 0000000..a4768f7
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.html
@@ -0,0 +1,907 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+ File TestSuitesTest.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ TestSuitesTest
+
+33
+ 14
+ 0%
+ 2
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class TestSuitesTest
+
+Line # 33
+ Total Statements 14
+ % Filtered 0%
+ Complexity 2
+ Uncovered Elements 0
+ TOTAL Coverage
+
+
+
+
+ testPojoGetterSetter() : void
+ testPojoGetterSetter() : void
+
+34 34
+1.0 1
+0.0 0%
+1.0 1
+0.0 0
+1.0
+
+
+ testToXml() : void
+ testToXml() : void
+
+39 39
+13.0 13
+0.0 0%
+1.0 1
+0.0 0
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 2 tests.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger .model ;
+
+
+25
+
+
+
+
+26
+
+import io.codeclou.java.junit.xml.merger .GetterSetterValidator ;
+
+
+27
+
+import io.codeclou.java.junit.xml.merger .JunitXmlParser ;
+
+
+28
+
+import org.junit.Test;
+
+
+29
+
+import org.w3c.dom.Document;
+
+
+30
+
+
+
+
+31
+
+import static org.junit.Assert.assertEquals;
+
+
+32
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (16)
+ Complexity: 2
+ Complexity Density: 0,14
+
+
+
+
+
+33
+
+public class TestSuitesTest {
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (1)
+ Complexity: 1
+ Complexity Density: 1
+ 1 PASS
+
+
+
+
+
+
+34
+ 1
+ @Test ...
+
+
+35
+
+ public void testPojoGetterSetter() {
+
+
+36
+ 1
+ GetterSetterValidator .validateAccessors(TestSuites .class );
+
+
+37
+
+ }
+
+
+38
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (13)
+ Complexity: 1
+ Complexity Density: 0,08
+ 1 PASS
+
+
+
+
+
+
+39
+ 1
+ @Test ...
+
+
+40
+
+ public void testToXml() throws Exception {
+
+
+41
+ 1
+ JunitXmlParser jxml = new JunitXmlParser ();
+
+
+42
+ 1
+ TestSuite suite1 = jxml.transform(XmlHelper .xmlFromString("<testsuite name='foo' time='4.20' errors='1' tests='3' failures='5' skipped='2'></testsuite>" .replaceAll("'" , "\"" )));
+
+
+43
+ 1
+ TestSuite suite2 = jxml.transform(XmlHelper .xmlFromString("<testsuite name='bar' time='21.01' errors='2' tests='4' failures='3' skipped='6'></testsuite>" .replaceAll("'" , "\"" )));
+
+
+44
+ 1
+ TestSuites suites = new TestSuites ();
+
+
+45
+ 1
+ suites.setName("foobar23" );
+
+
+46
+ 1
+ suites.getTestSuites().add(suite1);
+
+
+47
+ 1
+ suites.getTestSuites().add(suite2);
+
+
+48
+ 1
+ assertEquals(suites.getFailures(), new Long(8L));
+
+
+49
+ 1
+ assertEquals(suites.getTests(), new Long(7L));
+
+
+50
+ 1
+ assertEquals(suites.getName(), "foobar23" );
+
+
+51
+ 1
+ assertEquals(suites.getTime(), new Double(25.21));
+
+
+52
+
+
+
+
+53
+ 1
+ Document d = suites.toXml();
+
+
+54
+ 1
+ assertEquals(d.getFirstChild().getAttributes().getNamedItem("failures" ).getNodeValue(), "8" );
+
+
+55
+
+ }
+
+
+56
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.js
new file mode 100644
index 0000000..cd2af6b
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":56,"id":195,"methods":[{"el":37,"sc":5,"sl":34},{"el":55,"sc":5,"sl":39}],"name":"TestSuitesTest","sl":33}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_7":{"methods":[{"sl":34}],"name":"testPojoGetterSetter","pass":true,"statements":[{"sl":36}]},"test_8":{"methods":[{"sl":39}],"name":"testToXml","pass":true,"statements":[{"sl":41},{"sl":42},{"sl":43},{"sl":44},{"sl":45},{"sl":46},{"sl":47},{"sl":48},{"sl":49},{"sl":50},{"sl":51},{"sl":53},{"sl":54}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [7], [], [7], [], [], [8], [], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [8], [], [8], [8], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest_testPojoGetterSetter_7.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest_testPojoGetterSetter_7.html
new file mode 100644
index 0000000..8213222
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest_testPojoGetterSetter_7.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testPojoGetterSetter
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testPojoGetterSetter
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:22
+
+
+ 0.097
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest_testToXml_8.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest_testToXml_8.html
new file mode 100644
index 0000000..e8d7ef5
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/TestSuitesTest_testToXml_8.html
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test testToXml
+
+
+
+
+
+
+ Test
+ Status
+ Start time
+ Time (seconds)
+ Message
+
+
+
+
+
+ testToXml
+
+
+ 1 PASS
+
+
+ 9 Sep 13:37:22
+
+
+ 0.005
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/XmlHelper.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/XmlHelper.html
new file mode 100644
index 0000000..a1cfcaf
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/XmlHelper.html
@@ -0,0 +1,803 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+ File XmlHelper.java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+ Class
+ Line #
+
+
+
+ Total Statements
+
+
+
+
+ % Filtered
+
+
+
+
+ Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+ Actions
+
+
+
+ XmlHelper
+
+33
+ 4
+ 0%
+ 1
+ 0
+
+ Show methods
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class XmlHelper
+
+Line # 33
+ Total Statements 4
+ % Filtered 0%
+ Complexity 1
+ Uncovered Elements 0
+ TOTAL Coverage
+
+
+
+
+ xmlFromString(String) : Node
+ xmlFromString(String) : Node
+
+35 35
+4.0 4
+0.0 0%
+1.0 1
+0.0 0
+1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contributing tests
+
+
+ This file is covered by 1 test.
+
+ Select tests to highlight the test coverage
+ .
+
+
+
+
+
+
+
+
+
+
+
+ Select all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source view
+
+
+
+
+
+ Collapse all methods
+
+
+
+
+
+
+
+
+
+1
+
+
+
+
+2
+
+
+
+
+3
+
+
+
+
+4
+
+
+
+
+5
+
+
+
+
+6
+
+
+
+
+7
+
+
+
+
+8
+
+
+
+
+9
+
+
+
+
+10
+
+
+
+
+11
+
+
+
+
+12
+
+
+
+
+13
+
+
+
+
+14
+
+
+
+
+15
+
+
+
+
+16
+
+
+
+
+17
+
+
+
+
+18
+
+
+
+
+19
+
+
+
+
+20
+
+
+
+
+21
+
+
+
+
+22
+
+
+
+
+23
+
+
+
+
+24
+
+package io.codeclou.java.junit.xml.merger .model ;
+
+
+25
+
+
+
+
+26
+
+import org.w3c.dom.Document;
+
+
+27
+
+import org.w3c.dom.Node;
+
+
+28
+
+
+
+
+29
+
+import javax.xml.parsers.DocumentBuilder;
+
+
+30
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+
+31
+
+import java.io.ByteArrayInputStream;
+
+
+32
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (5)
+ Complexity: 1
+ Complexity Density: 0,25
+
+
+
+
+
+33
+
+public class XmlHelper {
+
+
+34
+
+
+
+
+
+
+
+
+
+ 100%
+ Uncovered Elements: 0 (4)
+ Complexity: 1
+ Complexity Density: 0,25
+
+
+
+
+
+35
+ 2
+ static Node xmlFromString(String xml) throws Exception { ...
+
+
+36
+ 2
+ DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+
+
+37
+ 2
+ DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+
+
+38
+ 2
+ Document d = dBuilder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8" )));
+
+
+39
+ 2
+ return d.getFirstChild();
+
+
+40
+
+ }
+
+
+41
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/XmlHelper.js b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/XmlHelper.js
new file mode 100644
index 0000000..4da948c
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/XmlHelper.js
@@ -0,0 +1,10 @@
+var clover = new Object();
+
+// JSON: {classes : [{name, id, sl, el, methods : [{sl, el}, ...]}, ...]}
+clover.pageData = {"classes":[{"el":41,"id":211,"methods":[{"el":40,"sc":5,"sl":35}],"name":"XmlHelper","sl":33}]}
+
+// JSON: {test_ID : {"methods": [ID1, ID2, ID3...], "name" : "testXXX() void"}, ...};
+clover.testTargets = {"test_8":{"methods":[{"sl":35}],"name":"testToXml","pass":true,"statements":[{"sl":36},{"sl":37},{"sl":38},{"sl":39}]}}
+
+// JSON: { lines : [{tests : [testid1, testid2, testid3, ...]}, ...]};
+clover.srcFileLines = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [8], [8], [8], [8], [8], [], []]
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/pkg-summary.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/pkg-summary.html
new file mode 100644
index 0000000..0eafe0d
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/pkg-summary.html
@@ -0,0 +1,474 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package
+
+ Files
+
+
+ % Filtered
+
+
+ Average Method Complexity
+
+
+ Uncovered Elements
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+ io.codeclou.java.junit.xml.merger.model
+ io.codeclou.java.junit.xml.merger.model
+
+
+
+
+ 2.0
+ 2
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+
+
+ Methods
+
+
+
+
+ % Filtered
+
+
+
+
+ Average Method Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+
+
+ TestSuite
+ TestSuite
+
+
+
+
+ 14.0
+ 14
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+ TestSuites
+ TestSuites
+
+
+
+
+ 7.0
+ 7
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/quick-wins.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/quick-wins.html
new file mode 100644
index 0000000..2210737
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/quick-wins.html
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-TestSuiteTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-TestSuiteTest.html
new file mode 100644
index 0000000..99d45af
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-TestSuiteTest.html
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class TestSuiteTest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+ Tests
+ Fail
+ Error
+
+ Time (secs)
+
+ % Tests Success
+
+
+
+
+ TestSuiteTest
+ 1 1
+0 0
+0 0
+ 0,011
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tests
+
+ Started
+ Status
+
+ Time (secs)
+
+ Message
+
+
+
+
+
+
+ TestSuiteTest.testPojoGetterSetter TestSuiteTest.testPojoGetterSetter
+ 1504957042163 9 Sep 13:37:22
+ 1 PASS
+
+ 0.011 0,011
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-TestSuitesTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-TestSuitesTest.html
new file mode 100644
index 0000000..112243c
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-TestSuitesTest.html
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class TestSuitesTest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+ Tests
+ Fail
+ Error
+
+ Time (secs)
+
+ % Tests Success
+
+
+
+
+ TestSuitesTest
+ 2 2
+0 0
+0 0
+ 0,102
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tests
+
+ Started
+ Status
+
+ Time (secs)
+
+ Message
+
+
+
+
+
+
+ TestSuitesTest.testPojoGetterSetter TestSuitesTest.testPojoGetterSetter
+ 1504957042063 9 Sep 13:37:22
+ 1 PASS
+
+ 0.097 0,097
+
+
+
+
+ TestSuitesTest.testToXml TestSuitesTest.testToXml
+ 1504957042057 9 Sep 13:37:22
+ 1 PASS
+
+ 0.005 0,005
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-XmlHelper.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-XmlHelper.html
new file mode 100644
index 0000000..b19e14e
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-XmlHelper.html
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class XmlHelper
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+ Tests
+ Fail
+ Error
+
+ Time (secs)
+
+ % Tests Success
+
+
+
+
+ XmlHelper
+ 0 0
+0 0
+0 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tests
+
+ Started
+ Status
+
+ Time (secs)
+
+ Message
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-pkg-summary.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-pkg-summary.html
new file mode 100644
index 0000000..3b0d49d
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/test-pkg-summary.html
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package
+ Tests
+ Fail
+ Error
+ Time
+ % Pass
+
+
+
+
+ io.codeclou.java.junit.xml.merger.model
+ 3 3
+0 0
+0 0
+ 0,113
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test Classes
+ Tests
+ Fail
+ Error
+ Time(secs)
+ % Pass
+
+
+
+
+
+
+
+
+
+ TestSuiteTest TestSuiteTest
+ 1 1
+0 0
+0 0
+ 0.011 0,011
+
+
+
+
+
+
+
+
+
+ TestSuitesTest TestSuitesTest
+ 2 2
+0 0
+0 0
+ 0.10200000000000001 0,102
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/testsrc-pkg-summary.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/testsrc-pkg-summary.html
new file mode 100644
index 0000000..6f5d20f
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/testsrc-pkg-summary.html
@@ -0,0 +1,514 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package
+
+ Files
+
+
+ % Filtered
+
+
+ Average Method Complexity
+
+
+ Uncovered Elements
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+ io.codeclou.java.junit.xml.merger.model
+ io.codeclou.java.junit.xml.merger.model
+
+
+
+
+ 3.0
+ 3
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+
+
+ Methods
+
+
+
+
+ % Filtered
+
+
+
+
+ Average Method Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+
+
+ TestSuiteTest
+ TestSuiteTest
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+ TestSuitesTest
+ TestSuitesTest
+
+
+
+
+ 2.0
+ 2
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+ XmlHelper
+ XmlHelper
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/top-risks.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/top-risks.html
new file mode 100644
index 0000000..ab1245a
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/model/top-risks.html
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger.model
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/pkg-summary.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/pkg-summary.html
new file mode 100644
index 0000000..fc8ffd1
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/pkg-summary.html
@@ -0,0 +1,474 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package
+
+ Files
+
+
+ % Filtered
+
+
+ Average Method Complexity
+
+
+ Uncovered Elements
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+ io.codeclou.java.junit.xml.merger
+ io.codeclou.java.junit.xml.merger
+
+
+
+
+ 2.0
+ 2
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 3.0
+ 3
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+
+
+ Methods
+
+
+
+
+ % Filtered
+
+
+
+
+ Average Method Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+
+
+ JunitXmlParser
+ JunitXmlParser
+
+
+
+
+ 3.0
+ 3
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 3.6666667
+ 3,67
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+ Merger
+ Merger
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/quick-wins.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/quick-wins.html
new file mode 100644
index 0000000..9a43246
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/quick-wins.html
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+
+
+
+
+
+
+
+
+
+ Include classes from sub-packages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-GetterSetterValidator.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-GetterSetterValidator.html
new file mode 100644
index 0000000..fa53399
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-GetterSetterValidator.html
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class GetterSetterValidator
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+ Tests
+ Fail
+ Error
+
+ Time (secs)
+
+ % Tests Success
+
+
+
+
+ GetterSetterValidator
+ 0 0
+0 0
+0 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tests
+
+ Started
+ Status
+
+ Time (secs)
+
+ Message
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-JunitXmlParserTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-JunitXmlParserTest.html
new file mode 100644
index 0000000..e754734
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-JunitXmlParserTest.html
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class JunitXmlParserTest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+ Tests
+ Fail
+ Error
+
+ Time (secs)
+
+ % Tests Success
+
+
+
+
+ JunitXmlParserTest
+ 7 7
+0 0
+0 0
+ 0,199
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-MergerTest.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-MergerTest.html
new file mode 100644
index 0000000..ddd6787
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-MergerTest.html
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class MergerTest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+ Tests
+ Fail
+ Error
+
+ Time (secs)
+
+ % Tests Success
+
+
+
+
+ MergerTest
+ 1 1
+0 0
+0 0
+ 0,044
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tests
+
+ Started
+ Status
+
+ Time (secs)
+
+ Message
+
+
+
+
+
+
+ MergerTest.testMergerValidInput MergerTest.testMergerValidInput
+ 1504957042004 9 Sep 13:37:22
+ 1 PASS
+
+ 0.044 0,044
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-pkg-summary.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-pkg-summary.html
new file mode 100644
index 0000000..aba1af1
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/test-pkg-summary.html
@@ -0,0 +1,268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package
+ Tests
+ Fail
+ Error
+ Time
+ % Pass
+
+
+
+
+ io.codeclou.java.junit.xml.merger
+ 8 8
+0 0
+0 0
+ 0,243
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Test Classes
+ Tests
+ Fail
+ Error
+ Time(secs)
+ % Pass
+
+
+
+
+
+
+
+
+
+ JunitXmlParserTest JunitXmlParserTest
+ 7 7
+0 0
+0 0
+ 0.199 0,199
+
+
+
+
+
+
+
+
+
+ MergerTest MergerTest
+ 1 1
+0 0
+0 0
+ 0.044 0,044
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/testsrc-pkg-summary.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/testsrc-pkg-summary.html
new file mode 100644
index 0000000..fbc2b03
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/testsrc-pkg-summary.html
@@ -0,0 +1,514 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Package
+
+ Files
+
+
+ % Filtered
+
+
+ Average Method Complexity
+
+
+ Uncovered Elements
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+ io.codeclou.java.junit.xml.merger
+ io.codeclou.java.junit.xml.merger
+
+
+
+
+ 3.0
+ 3
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class
+
+
+ Methods
+
+
+
+
+ % Filtered
+
+
+
+
+ Average Method Complexity
+
+
+
+
+ Uncovered Elements
+
+
+
+
+ TOTAL Coverage
+
+
+
+
+
+
+
+
+ GetterSetterValidator
+ GetterSetterValidator
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+ JunitXmlParserTest
+ JunitXmlParserTest
+
+
+
+
+ 8.0
+ 8
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+ MergerTest
+ MergerTest
+
+
+
+
+ 2.0
+ 2
+
+
+
+
+ 0.0
+ 0%
+
+
+
+
+ 1.0
+ 1
+
+
+
+
+ 0.0
+ 0
+
+
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/top-risks.html b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/top-risks.html
new file mode 100644
index 0000000..befe881
--- /dev/null
+++ b/test-coverage/1.0.0/io/codeclou/java/junit/xml/merger/top-risks.html
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ java-junit-xml-merger 1.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Packages
+
+
+
+
+ No results found.
+
+
+
+
+
+
+
+
+
+
+
+
+ Project Clover database Sa Sep 9 2017 13:37:19 MESZ
+
+
+
+ Package io.codeclou.java.junit.xml.merger
+
+
+
+
+
+
+
+
+
+
+
+
+ Include classes from sub-packages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test-coverage/1.0.0/jit.js b/test-coverage/1.0.0/jit.js
new file mode 100644
index 0000000..bc361ad
--- /dev/null
+++ b/test-coverage/1.0.0/jit.js
@@ -0,0 +1,8841 @@
+(function () {
+
+/*
+ File: Core.js
+
+ Description:
+
+ Provides common utility functions and the Class object used internally by the library.
+
+ Also provides the object for manipulating JSON tree structures
+
+ Some of the Basic utility functions and the Class system are based in the MooTools Framework . Copyright (c) 2006-2009 Valerio Proietti, . MIT license .
+
+ Author:
+
+ Nicolas Garcia Belmonte
+
+ Copyright:
+
+ Copyright 2008-2009 by Nicolas Garcia Belmonte.
+
+ Homepage:
+
+
+
+ Version:
+
+ 1.1.2
+
+ License:
+
+ BSD License
+
+> Redistribution and use in source and binary forms, with or without
+> modification, are permitted provided that the following conditions are met:
+> * Redistributions of source code must retain the above copyright
+> notice, this list of conditions and the following disclaimer.
+> * Redistributions in binary form must reproduce the above copyright
+> notice, this list of conditions and the following disclaimer in the
+> documentation and/or other materials provided with the distribution.
+> * Neither the name of the organization nor the
+> names of its contributors may be used to endorse or promote products
+> derived from this software without specific prior written permission.
+>
+> THIS SOFTWARE IS PROVIDED BY Nicolas Garcia Belmonte ``AS IS'' AND ANY
+> EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+> DISCLAIMED. IN NO EVENT SHALL Nicolas Garcia Belmonte BE LIABLE FOR ANY
+> DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+> ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+function $empty() {};
+
+function $extend(original, extended){
+ for (var key in (extended || {})) original[key] = extended[key];
+ return original;
+};
+
+function $lambda(value){
+ return (typeof value == 'function') ? value : function(){
+ return value;
+ };
+};
+
+var $time = Date.now || function(){
+ return +new Date;
+};
+
+function $splat(obj){
+ var type = $type(obj);
+ return (type) ? ((type != 'array') ? [obj] : obj) : [];
+};
+
+var $type = function(elem) {
+ return $type.s.call(elem).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
+};
+$type.s = Object.prototype.toString;
+
+function $each(iterable, fn){
+ var type = $type(iterable);
+ if(type == 'object') {
+ for (var key in iterable) fn(iterable[key], key);
+ } else {
+ for(var i=0; i < iterable.length; i++) fn(iterable[i], i);
+ }
+};
+
+function $merge(){
+ var mix = {};
+ for (var i = 0, l = arguments.length; i < l; i++){
+ var object = arguments[i];
+ if ($type(object) != 'object') continue;
+ for (var key in object){
+ var op = object[key], mp = mix[key];
+ mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $merge(mp, op) : $unlink(op);
+ }
+ }
+ return mix;
+};
+
+function $unlink(object){
+ var unlinked;
+ switch ($type(object)){
+ case 'object':
+ unlinked = {};
+ for (var p in object) unlinked[p] = $unlink(object[p]);
+ break;
+ case 'array':
+ unlinked = [];
+ for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
+ break;
+ default: return object;
+ }
+ return unlinked;
+};
+
+function $rgbToHex(srcArray, array){
+ if (srcArray.length < 3) return null;
+ if (srcArray.length == 4 && srcArray[3] == 0 && !array) return 'transparent';
+ var hex = [];
+ for (var i = 0; i < 3; i++){
+ var bit = (srcArray[i] - 0).toString(16);
+ hex.push((bit.length == 1) ? '0' + bit : bit);
+ }
+ return (array) ? hex : '#' + hex.join('');
+};
+
+function $destroy(elem) {
+ $clean(elem);
+ if(elem.parentNode) elem.parentNode.removeChild(elem);
+ if(elem.clearAttributes) elem.clearAttributes();
+};
+
+function $clean(elem) {
+ for(var ch = elem.childNodes, i=0; i < ch.length; i++) {
+ $destroy(ch[i]);
+ }
+};
+
+function $addEvent(obj, type, fn) {
+ if (obj.addEventListener)
+ obj.addEventListener(type, fn, false);
+ else
+ obj.attachEvent('on' + type, fn);
+};
+
+function $hasClass(obj, klass) {
+ return (' ' + obj.className + ' ').indexOf(' ' + klass + ' ') > -1;
+};
+
+function $addClass(obj, klass) {
+ if(!$hasClass(obj, klass)) obj.className = (obj.className + " " + klass);
+};
+
+function $removeClass(obj, klass) {
+ obj.className = obj.className.replace(new RegExp('(^|\\s)' + klass + '(?:\\s|$)'), '$1');
+};
+
+function $get(id) {
+ return document.getElementById(id);
+};
+
+var Class = function(properties){
+ properties = properties || {};
+ var klass = function(){
+// not defining any attributes in Class properties.
+// for (var key in this){
+// if (typeof this[key] != 'function') this[key] = $unlink(this[key]);
+// }
+ this.constructor = klass;
+ if (Class.prototyping) return this;
+ var instance = (this.initialize) ? this.initialize.apply(this, arguments) : this;
+ return instance;
+ };
+
+ for (var mutator in Class.Mutators){
+ if (!properties[mutator]) continue;
+ properties = Class.Mutators[mutator](properties, properties[mutator]);
+ delete properties[mutator];
+ }
+
+ $extend(klass, this);
+ klass.constructor = Class;
+ klass.prototype = properties;
+ return klass;
+};
+
+Class.Mutators = {
+
+ Extends: function(self, klass){
+ Class.prototyping = klass.prototype;
+ var subclass = new klass;
+ delete subclass.parent;
+ subclass = Class.inherit(subclass, self);
+ delete Class.prototyping;
+ return subclass;
+ },
+
+ Implements: function(self, klasses){
+ $each($splat(klasses), function(klass){
+ Class.prototying = klass;
+ $extend(self, ($type(klass) == 'function') ? new klass : klass);
+ delete Class.prototyping;
+ });
+ return self;
+ }
+
+};
+
+$extend(Class, {
+
+ inherit: function(object, properties){
+ var caller = arguments.callee.caller;
+ for (var key in properties){
+ var override = properties[key];
+ var previous = object[key];
+ var type = $type(override);
+ if (previous && type == 'function'){
+ if (override != previous){
+ if (caller){
+ override.__parent = previous;
+ object[key] = override;
+ } else {
+ Class.override(object, key, override);
+ }
+ }
+ } else if(type == 'object'){
+ object[key] = $merge(previous, override);
+ } else {
+ object[key] = override;
+ }
+ }
+
+ if (caller) object.parent = function(){
+ return arguments.callee.caller.__parent.apply(this, arguments);
+ };
+
+ return object;
+ },
+
+ override: function(object, name, method){
+ var parent = Class.prototyping;
+ if (parent && object[name] != parent[name]) parent = null;
+ var override = function(){
+ var previous = this.parent;
+ this.parent = parent ? parent[name] : object[name];
+ var value = method.apply(this, arguments);
+ this.parent = previous;
+ return value;
+ };
+ object[name] = override;
+ }
+
+});
+
+
+Class.prototype.implement = function(){
+ var proto = this.prototype;
+ $each(Array.prototype.slice.call(arguments || []), function(properties){
+ Class.inherit(proto, properties);
+ });
+ return this;
+};
+
+/*
+ Object: TreeUtil
+
+ Some common JSON tree manipulation methods.
+*/
+this.TreeUtil = {
+
+ /*
+ Method: prune
+
+ Clears all tree nodes having depth greater than maxLevel.
+
+ Parameters:
+
+ tree - A JSON tree object. For more information please see .
+ maxLevel - An integer specifying the maximum level allowed for this tree. All nodes having depth greater than max level will be deleted.
+
+ */
+ prune: function(tree, maxLevel) {
+ this.each(tree, function(elem, i) {
+ if(i == maxLevel && elem.children) {
+ delete elem.children;
+ elem.children = [];
+ }
+ });
+ },
+
+ /*
+ Method: getParent
+
+ Returns the parent node of the node having _id_ as id.
+
+ Parameters:
+
+ tree - A JSON tree object. See also .
+ id - The _id_ of the child node whose parent will be returned.
+
+ Returns:
+
+ A tree JSON node if any, or false otherwise.
+
+ */
+ getParent: function(tree, id) {
+ if(tree.id == id) return false;
+ var ch = tree.children;
+ if(ch && ch.length > 0) {
+ for(var i=0; i.
+ id - A node *unique* identifier.
+
+ Returns:
+
+ A subtree having a root node matching the given id. Returns null if no subtree matching the id is found.
+
+ */
+ getSubtree: function(tree, id) {
+ if(tree.id == id) return tree;
+ for(var i=0, ch=tree.children; i.
+ maxLevel - _optional_ A subtree's max level.
+
+ Returns:
+
+ An array having objects with two properties.
+
+ - The _node_ property contains the leaf node.
+ - The _level_ property specifies the depth of the node.
+
+ */
+ getLeaves: function (node, maxLevel) {
+ var leaves = [], levelsToShow = maxLevel || Number.MAX_VALUE;
+ this.each(node, function(elem, i) {
+ if(i < levelsToShow &&
+ (!elem.children || elem.children.length == 0 )) {
+ leaves.push({
+ 'node':elem,
+ 'level':levelsToShow - i
+ });
+ }
+ });
+ return leaves;
+ },
+
+
+ /*
+ Method: eachLevel
+
+ Iterates on tree nodes with relative depth less or equal than a specified level.
+
+ Parameters:
+
+ tree - A JSON tree or subtree. See also .
+ initLevel - An integer specifying the initial relative level. Usually zero.
+ toLevel - An integer specifying a top level. This method will iterate only through nodes with depth less than or equal this number.
+ action - A function that receives a node and an integer specifying the actual level of the node.
+
+ Example:
+ (start code js)
+ TreeUtil.eachLevel(tree, 0, 3, function(node, depth) {
+ alert(node.name + ' ' + depth);
+ });
+ (end code)
+ */
+ eachLevel: function(tree, initLevel, toLevel, action) {
+ if(initLevel <= toLevel) {
+ action(tree, initLevel);
+ for(var i=0, ch = tree.children; i.
+ action - A function that receives a node.
+
+ Example:
+ (start code js)
+ TreeUtil.each(tree, function(node) {
+ alert(node.name);
+ });
+ (end code)
+
+ */
+ each: function(tree, action) {
+ this.eachLevel(tree, 0, Number.MAX_VALUE, action);
+ },
+
+ /*
+ Method: loadSubtrees
+
+ Appends subtrees to leaves by requesting new subtrees
+ with the _request_ method.
+
+ Parameters:
+
+ tree - A JSON tree node. .
+ controller - An object that implements a request method.
+
+ Example:
+ (start code js)
+ TreeUtil.loadSubtrees(leafNode, {
+ request: function(nodeId, level, onComplete) {
+ //Pseudo-code to make an ajax request for a new subtree
+ // that has as root id _nodeId_ and depth _level_ ...
+ Ajax.request({
+ 'url': 'http://subtreerequesturl/',
+
+ onSuccess: function(json) {
+ onComplete.onComplete(nodeId, json);
+ }
+ });
+ }
+ });
+ (end code)
+ */
+ loadSubtrees: function(tree, controller) {
+ var maxLevel = controller.request && controller.levelsToShow;
+ var leaves = this.getLeaves(tree, maxLevel),
+ len = leaves.length,
+ selectedNode = {};
+ if(len == 0) controller.onComplete();
+ for(var i=0, counter=0; i, ,
+ */
+/*
+ Class: Canvas
+ A multi-purpose Canvas Class. This Class can be used with the ExCanvas library to provide
+ cross browser Canvas based visualizations.
+ Parameters:
+ id - The canvas id. This id will be used as prefix for the canvas widget DOM elements ids.
+ options - An object containing multiple options such as
+
+ - _injectInto_ This property is _required_ and it specifies the id of the DOM element
+ to which the Canvas widget will be appended
+ - _width_ The width of the Canvas widget. Default's to 200px
+ - _height_ The height of the Canvas widget. Default's to 200px
+ - _backgroundColor_ Used for compatibility with IE. The canvas' background color.
+ Default's to '#333'
+ - _styles_ A hash containing canvas specific style properties such as _fillStyle_ and _strokeStyle_ among others.
+ Example:
+ Suppose we have this HTML
+ (start code xml)
+
+ (end code)
+ Now we create a new Canvas instance
+ (start code js)
+ //Create a new canvas instance
+ var canvas = new Canvas('mycanvas', {
+ //Where to inject the canvas. Any div container will do.
+ 'injectInto':'infovis',
+ //width and height for canvas. Default's to 200.
+ 'width': 900,
+ 'height':500,
+ //Canvas styles
+ 'styles': {
+ 'fillStyle': '#ccddee',
+ 'strokeStyle': '#772277'
+ }
+ });
+ (end code)
+ The generated HTML will look like this
+ (start code xml)
+
+ (end code)
+ As you can see, the generated HTML consists of a canvas DOM element of id _mycanvas-canvas_ and a div label container
+ of id _mycanvas-label_, wrapped in a main div container of id _mycanvas_.
+ You can also add a background canvas, for making background drawings.
+ This is how the background concentric circles are drawn
+ Example:
+ (start code js)
+ //Create a new canvas instance.
+ var canvas = new Canvas('mycanvas', {
+ //Where to inject the canvas. Any div container will do.
+ 'injectInto':'infovis',
+ //width and height for canvas. Default's to 200.
+ 'width': 900,
+ 'height':500,
+ //Canvas styles
+ 'styles': {
+ 'fillStyle': '#ccddee',
+ 'strokeStyle': '#772277'
+ },
+ //Add a background canvas for plotting
+ //concentric circles.
+ 'backgroundCanvas': {
+ //Add Canvas styles for the bck canvas.
+ 'styles': {
+ 'fillStyle': '#444',
+ 'strokeStyle': '#444'
+ },
+ //Add the initialization and plotting functions.
+ 'impl': {
+ 'init': function() {},
+ 'plot': function(canvas, ctx) {
+ var times = 6, d = 100;
+ var pi2 = Math.PI*2;
+ for(var i=1; i<=times; i++) {
+ ctx.beginPath();
+ ctx.arc(0, 0, i * d, 0, pi2, true);
+ ctx.stroke();
+ ctx.closePath();
+ }
+ }
+ }
+ }
+ });
+ (end code)
+ The _backgroundCanvas_ object contains a canvas _styles_ property and
+ an _impl_ key to be used for implementing background canvas specific code.
+ The _init_ method is only called once, at the instanciation of the background canvas.
+ The _plot_ method is called for plotting a Canvas image.
+ */
+this.Canvas = (function(){
+ var config = {
+ 'injectInto': 'id',
+
+ 'width': 200,
+ 'height': 200,
+
+ 'backgroundColor': '#333333',
+
+ 'styles': {
+ 'fillStyle': '#000000',
+ 'strokeStyle': '#000000'
+ },
+
+ 'backgroundCanvas': false
+ };
+
+ function hasCanvas(){
+ hasCanvas.t = hasCanvas.t || typeof(HTMLCanvasElement);
+ return "function" == hasCanvas.t || "object" == hasCanvas.t;
+ };
+
+ function create(tag, prop, styles){
+ var elem = document.createElement(tag);
+ (function(obj, prop){
+ if (prop)
+ for (var p in prop)
+ obj[p] = prop[p];
+ return arguments.callee;
+ })(elem, prop)(elem.style, styles);
+ //feature check
+ if (tag == "canvas" && !hasCanvas() && G_vmlCanvasManager) {
+ elem = G_vmlCanvasManager.initElement(document.body.appendChild(elem));
+ }
+
+ return elem;
+ };
+
+ function get(id){
+ return document.getElementById(id);
+ };
+
+ function translateToCenter(canvas, ctx, w, h){
+ var width = w ? (w - canvas.width) : canvas.width;
+ var height = h ? (h - canvas.height) : canvas.height;
+ ctx.translate(width / 2, height / 2);
+ };
+
+ return function(id, opt){
+ var ctx, bkctx, mainContainer, labelContainer, canvas, bkcanvas;
+ if (arguments.length < 1)
+ throw "Arguments missing";
+ var idLabel = id + "-label", idCanvas = id + "-canvas", idBCanvas = id + "-bkcanvas";
+ opt = $merge(config, opt ||
+ {});
+ //create elements
+ var dim = {
+ 'width': opt.width,
+ 'height': opt.height
+ };
+ mainContainer = create("div", {
+ 'id': id
+ }, $merge(dim, {
+ 'position': 'relative'
+ }));
+ labelContainer = create("div", {
+ 'id': idLabel
+ }, {
+ 'overflow': 'visible',
+ 'position': 'absolute',
+ 'top': 0,
+ 'left': 0,
+ 'width': dim.width + 'px',
+ 'height': 0
+ });
+ var dimPos = {
+ 'position': 'absolute',
+ 'top': 0,
+ 'left': 0,
+ 'width': dim.width + 'px',
+ 'height': dim.height + 'px'
+ };
+ canvas = create("canvas", $merge({
+ 'id': idCanvas
+ }, dim), dimPos);
+ var bc = opt.backgroundCanvas;
+ if (bc) {
+ bkcanvas = create("canvas", $merge({
+ 'id': idBCanvas
+ }, dim), dimPos);
+ //append elements
+ mainContainer.appendChild(bkcanvas);
+ }
+ mainContainer.appendChild(canvas);
+ mainContainer.appendChild(labelContainer);
+ get(opt.injectInto).appendChild(mainContainer);
+
+ //create contexts
+ ctx = canvas.getContext('2d');
+ translateToCenter(canvas, ctx);
+ var st = opt.styles;
+ for (var s in st)
+ ctx[s] = st[s];
+ if (bc) {
+ bkctx = bkcanvas.getContext('2d');
+ var st = bc.styles;
+ for (var s in st)
+ bkctx[s] = st[s];
+ translateToCenter(bkcanvas, bkctx);
+ bc.impl.init(bkcanvas, bkctx);
+ bc.impl.plot(bkcanvas, bkctx);
+ }
+ //create methods
+ return {
+ 'id': id,
+ /*
+ Method: getCtx
+
+ Returns the main canvas context object
+ Returns:
+
+ Main canvas context
+ Example:
+ (start code js)
+ var ctx = canvas.getCtx();
+ //Now I can use the native canvas context
+ //and for example change some canvas styles
+ ctx.globalAlpha = 1;
+ (end code)
+ */
+ getCtx: function(){
+ return ctx;
+ },
+
+ /*
+ Method: getElement
+ Returns the main Canvas DOM wrapper
+
+ Returns:
+
+ DOM canvas wrapper generated, (i.e the div wrapper element with id _mycanvas_)
+ Example:
+ (start code js)
+ var wrapper = canvas.getElement();
+ //Returns ...
as element
+ (end code)
+ */
+ getElement: function(){
+ return mainContainer;
+ },
+
+ /*
+ Method: resize
+
+ Resizes the canvas.
+
+ Parameters:
+
+ width - New canvas width.
+ height - New canvas height.
+ This method can be used with the , or visualizations to resize
+ the visualizations
+ Example:
+ (start code js)
+ function resizeViz(width, height) {
+ canvas.resize(width, height);
+ rgraph.refresh(); //ht.refresh or st.refresh() also work.
+ rgraph.onAfterCompute();
+ }
+ (end code)
+
+ */
+ resize: function(width, height){
+ canvas.width = width;
+ canvas.height = height;
+ canvas.style.width = width + "px";
+ canvas.style.height = height + "px";
+ if (bc) {
+ bkcanvas.width = width;
+ bkcanvas.height = height;
+ bkcanvas.style.width = width + "px";
+ bkcanvas.style.height = height + "px";
+ }
+ translateToCenter(canvas, ctx);
+ var st = opt.styles;
+ for (var s in st)
+ ctx[s] = st[s];
+ if (bc) {
+ var st = bc.styles;
+ for (var s in st)
+ bkctx[s] = st[s];
+ translateToCenter(bkcanvas, bkctx);
+ bc.impl.init(bkcanvas, bkctx);
+ bc.impl.plot(bkcanvas, bkctx);
+ }
+ },
+
+ /*
+ Method: getSize
+
+ Returns canvas dimensions.
+
+ Returns:
+
+ An object with _width_ and _height_ properties.
+ Example:
+ (start code js)
+ canvas.getSize(); //returns { width: 900, height: 500 }
+ (end code)
+ */
+ getSize: function(){
+ return {
+ 'width': canvas.width,
+ 'height': canvas.height
+ };
+ },
+
+ path: function(type, action){
+ ctx.beginPath();
+ action(ctx);
+ ctx[type]();
+ ctx.closePath();
+ },
+
+ /*
+ Method: clear
+
+ Clears the canvas object.
+ */
+ clear: function(){
+ var size = this.getSize();
+ ctx.clearRect(-size.width / 2, -size.height / 2, size.width, size.height);
+ },
+
+ /*
+ Method: clearReactangle
+
+ Same as but only clears a section of the canvas.
+
+ Parameters:
+
+ top - An integer specifying the top of the rectangle.
+ right - An integer specifying the right of the rectangle.
+ bottom - An integer specifying the bottom of the rectangle.
+ left - An integer specifying the left of the rectangle.
+ */
+ clearRectangle: function(top, right, bottom, left){
+ //if using excanvas
+ if (!hasCanvas()) {
+ var f0 = ctx.fillStyle;
+ ctx.fillStyle = opt.backgroundColor;
+ ctx.fillRect(left, top, Math.abs(right - left), Math.abs(bottom - top));
+ ctx.fillStyle = f0;
+ }
+ else {
+ ctx.clearRect(left, top, Math.abs(right - left), Math.abs(bottom - top));
+ }
+ }
+ };
+ };
+
+})();
+
+
+
+/*
+ * File: Polar.js
+ *
+ * Defines the class.
+ *
+ * Description:
+ *
+ * The class, just like the class, is used by the , and as a 2D point representation.
+ *
+ * See also:
+ *
+ *
+ *
+*/
+
+/*
+ Class: Polar
+
+ A multi purpose polar representation.
+
+ Description:
+
+ The class, just like the class, is used by the , and as a 2D point representation.
+
+ See also:
+
+
+
+ Parameters:
+
+ theta - An angle.
+ rho - The norm.
+*/
+
+this.Polar = function(theta, rho) {
+ this.theta = theta;
+ this.rho = rho;
+};
+
+Polar.prototype = {
+ /*
+ Method: getc
+
+ Returns a complex number.
+
+ Parameters:
+
+ simple - _optional_ If *true*, this method will return only an object holding x and y properties and not a instance. Default's *false*.
+
+ Returns:
+
+ A complex number.
+ */
+ getc: function(simple) {
+ return this.toComplex(simple);
+ },
+
+ /*
+ Method: getp
+
+ Returns a representation.
+
+ Returns:
+
+ A variable in polar coordinates.
+ */
+ getp: function() {
+ return this;
+ },
+
+
+ /*
+ Method: set
+
+ Sets a number.
+
+ Parameters:
+
+ v - A or instance.
+
+ */
+ set: function(v) {
+ v = v.getp();
+ this.theta = v.theta; this.rho = v.rho;
+ },
+
+ /*
+ Method: setc
+
+ Sets a number.
+
+ Parameters:
+
+ x - A number real part.
+ y - A number imaginary part.
+
+ */
+ setc: function(x, y) {
+ this.rho = Math.sqrt(x * x + y * y);
+ this.theta = Math.atan2(y, x);
+ if(this.theta < 0) this.theta += Math.PI * 2;
+ },
+
+ /*
+ Method: setp
+
+ Sets a polar number.
+
+ Parameters:
+
+ theta - A number angle property.
+ rho - A number rho property.
+
+ */
+ setp: function(theta, rho) {
+ this.theta = theta;
+ this.rho = rho;
+ },
+
+ /*
+ Method: clone
+
+ Returns a copy of the current object.
+
+ Returns:
+
+ A copy of the real object.
+ */
+ clone: function() {
+ return new Polar(this.theta, this.rho);
+ },
+
+ /*
+ Method: toComplex
+
+ Translates from polar to cartesian coordinates and returns a new instance.
+
+ Parameters:
+
+ simple - _optional_ If *true* this method will only return an object with x and y properties (and not the whole instance). Default's *false*.
+
+ Returns:
+
+ A new instance.
+ */
+ toComplex: function(simple) {
+ var x = Math.cos(this.theta) * this.rho;
+ var y = Math.sin(this.theta) * this.rho;
+ if(simple) return { 'x': x, 'y': y};
+ return new Complex(x, y);
+ },
+
+ /*
+ Method: add
+
+ Adds two instances.
+
+ Parameters:
+
+ polar - A number.
+
+ Returns:
+
+ A new Polar instance.
+ */
+ add: function(polar) {
+ return new Polar(this.theta + polar.theta, this.rho + polar.rho);
+ },
+
+ /*
+ Method: scale
+
+ Scales a polar norm.
+
+ Parameters:
+
+ number - A scale factor.
+
+ Returns:
+
+ A new Polar instance.
+ */
+ scale: function(number) {
+ return new Polar(this.theta, this.rho * number);
+ },
+
+ /*
+ Method: equals
+
+ Comparison method.
+
+ Returns *true* if the theta and rho properties are equal.
+
+ Parameters:
+
+ c - A number.
+
+ Returns:
+
+ *true* if the theta and rho parameters for these objects are equal. *false* otherwise.
+ */
+ equals: function(c) {
+ return this.theta == c.theta && this.rho == c.rho;
+ },
+
+ /*
+ Method: $add
+
+ Adds two instances affecting the current object.
+
+ Paramters:
+
+ polar - A instance.
+
+ Returns:
+
+ The changed object.
+ */
+ $add: function(polar) {
+ this.theta = this.theta + polar.theta; this.rho += polar.rho;
+ return this;
+ },
+
+ /*
+ Method: $madd
+
+ Adds two instances affecting the current object. The resulting theta angle is modulo 2pi.
+
+ Parameters:
+
+ polar - A instance.
+
+ Returns:
+
+ The changed object.
+ */
+ $madd: function(polar) {
+ this.theta = (this.theta + polar.theta) % (Math.PI * 2); this.rho += polar.rho;
+ return this;
+ },
+
+
+ /*
+ Method: $scale
+
+ Scales a polar instance affecting the object.
+
+ Parameters:
+
+ number - A scaling factor.
+
+ Returns:
+
+ The changed object.
+ */
+ $scale: function(number) {
+ this.rho *= number;
+ return this;
+ },
+
+ /*
+ Method: interpolate
+
+ Calculates a polar interpolation between two points at a given delta moment.
+
+ Parameters:
+
+ elem - A instance.
+ delta - A delta factor ranging [0, 1].
+
+ Returns:
+
+ A new instance representing an interpolation between _this_ and _elem_
+ */
+ interpolate: function(elem, delta) {
+ var pi = Math.PI, pi2 = pi * 2;
+ var ch = function(t) {
+ return (t < 0)? (t % pi2) + pi2 : t % pi2;
+ };
+ var tt = this.theta, et = elem.theta;
+ var sum;
+ if(Math.abs(tt - et) > pi) {
+ if(tt > et) {
+ sum =ch((et + ((tt - pi2) - et) * delta)) ;
+ } else {
+ sum =ch((et - pi2 + (tt - (et - pi2)) * delta));
+ }
+ } else {
+ sum =ch((et + (tt - et) * delta)) ;
+ }
+ var r = (this.rho - elem.rho) * delta + elem.rho;
+ return {
+ 'theta': sum,
+ 'rho': r
+ };
+ }
+};
+
+
+var $P = function(a, b) { return new Polar(a, b); };
+
+Polar.KER = $P(0, 0);
+
+
+
+/*
+ * File: Complex.js
+ *
+ * Defines the class.
+ *
+ * Description:
+ *
+ * The class, just like the class, is used by the , and as a 2D point representation.
+ *
+ * See also:
+ *
+ *
+ *
+*/
+
+/*
+ Class: Complex
+
+ A multi-purpose Complex Class with common methods.
+
+ Description:
+
+ The class, just like the class, is used by the , and as a 2D point representation.
+
+ See also:
+
+
+
+ Parameters:
+
+ x - _optional_ A Complex number real part.
+ y - _optional_ A Complex number imaginary part.
+
+*/
+
+this.Complex = function(x, y) {
+ this.x = x;
+ this.y = y;
+};
+
+Complex.prototype = {
+ /*
+ Method: getc
+
+ Returns a complex number.
+
+ Returns:
+
+ A complex number.
+ */
+ getc: function() {
+ return this;
+ },
+
+ /*
+ Method: getp
+
+ Returns a representation of this number.
+
+ Parameters:
+
+ simple - _optional_ If *true*, this method will return only an object holding theta and rho properties and not a instance. Default's *false*.
+
+ Returns:
+
+ A variable in coordinates.
+ */
+ getp: function(simple) {
+ return this.toPolar(simple);
+ },
+
+
+ /*
+ Method: set
+
+ Sets a number.
+
+ Parameters:
+
+ c - A or instance.
+
+ */
+ set: function(c) {
+ c = c.getc(true);
+ this.x = c.x;
+ this.y = c.y;
+ },
+
+ /*
+ Method: setc
+
+ Sets a complex number.
+
+ Parameters:
+
+ x - A number Real part.
+ y - A number Imaginary part.
+
+ */
+ setc: function(x, y) {
+ this.x = x;
+ this.y = y;
+ },
+
+ /*
+ Method: setp
+
+ Sets a polar number.
+
+ Parameters:
+
+ theta - A number theta property.
+ rho - A number rho property.
+
+ */
+ setp: function(theta, rho) {
+ this.x = Math.cos(theta) * rho
+ this.y = Math.sin(theta) * rho;
+ },
+
+ /*
+ Method: clone
+
+ Returns a copy of the current object.
+
+ Returns:
+
+ A copy of the real object.
+ */
+ clone: function() {
+ return new Complex(this.x, this.y);
+ },
+
+ /*
+ Method: toPolar
+
+ Transforms cartesian to polar coordinates.
+
+ Parameters:
+
+ simple - _optional_ If *true* this method will only return an object with theta and rho properties (and not the whole instance). Default's *false*.
+
+ Returns:
+
+ A new instance.
+ */
+
+ toPolar: function(simple) {
+ var rho = this.norm();
+ var atan = Math.atan2(this.y, this.x);
+ if(atan < 0) atan += Math.PI * 2;
+ if(simple) return { 'theta': atan, 'rho': rho };
+ return new Polar(atan, rho);
+ },
+ /*
+ Method: norm
+
+ Calculates a number norm.
+
+ Returns:
+
+ A real number representing the complex norm.
+ */
+ norm: function () {
+ return Math.sqrt(this.squaredNorm());
+ },
+
+ /*
+ Method: squaredNorm
+
+ Calculates a number squared norm.
+
+ Returns:
+
+ A real number representing the complex squared norm.
+ */
+ squaredNorm: function () {
+ return this.x*this.x + this.y*this.y;
+ },
+
+ /*
+ Method: add
+
+ Returns the result of adding two complex numbers.
+
+ Does not alter the original object.
+
+ Parameters:
+
+ pos - A instance.
+
+ Returns:
+
+ The result of adding two complex numbers.
+ */
+ add: function(pos) {
+ return new Complex(this.x + pos.x, this.y + pos.y);
+ },
+
+ /*
+ Method: prod
+
+ Returns the result of multiplying two numbers.
+
+ Does not alter the original object.
+
+ Parameters:
+
+ pos - A instance.
+
+ Returns:
+
+ The result of multiplying two complex numbers.
+ */
+ prod: function(pos) {
+ return new Complex(this.x*pos.x - this.y*pos.y, this.y*pos.x + this.x*pos.y);
+ },
+
+ /*
+ Method: conjugate
+
+ Returns the conjugate of this number.
+
+ Does not alter the original object.
+
+ Returns:
+
+ The conjugate of this number.
+ */
+ conjugate: function() {
+ return new Complex(this.x, -this.y);
+ },
+
+
+ /*
+ Method: scale
+
+ Returns the result of scaling a instance.
+
+ Does not alter the original object.
+
+ Parameters:
+
+ factor - A scale factor.
+
+ Returns:
+
+ The result of scaling this complex to a factor.
+ */
+ scale: function(factor) {
+ return new Complex(this.x * factor, this.y * factor);
+ },
+
+ /*
+ Method: equals
+
+ Comparison method.
+
+ Returns *true* if both real and imaginary parts are equal.
+
+ Parameters:
+
+ c - A instance.
+
+ Returns:
+
+ A boolean instance indicating if both numbers are equal.
+ */
+ equals: function(c) {
+ return this.x == c.x && this.y == c.y;
+ },
+
+ /*
+ Method: $add
+
+ Returns the result of adding two numbers.
+
+ Alters the original object.
+
+ Parameters:
+
+ pos - A instance.
+
+ Returns:
+
+ The result of adding two complex numbers.
+ */
+ $add: function(pos) {
+ this.x += pos.x; this.y += pos.y;
+ return this;
+ },
+
+ /*
+ Method: $prod
+
+ Returns the result of multiplying two numbers.
+
+ Alters the original object.
+
+ Parameters:
+
+ pos - A instance.
+
+ Returns:
+
+ The result of multiplying two complex numbers.
+ */
+ $prod:function(pos) {
+ var x = this.x, y = this.y
+ this.x = x*pos.x - y*pos.y;
+ this.y = y*pos.x + x*pos.y;
+ return this;
+ },
+
+ /*
+ Method: $conjugate
+
+ Returns the conjugate for this .
+
+ Alters the original object.
+
+ Returns:
+
+ The conjugate for this complex.
+ */
+ $conjugate: function() {
+ this.y = -this.y;
+ return this;
+ },
+
+ /*
+ Method: $scale
+
+ Returns the result of scaling a instance.
+
+ Alters the original object.
+
+ Parameters:
+
+ factor - A scale factor.
+
+ Returns:
+
+ The result of scaling this complex to a factor.
+ */
+ $scale: function(factor) {
+ this.x *= factor; this.y *= factor;
+ return this;
+ },
+
+ /*
+ Method: $div
+
+ Returns the division of two numbers.
+
+ Alters the original object.
+
+ Parameters:
+
+ pos - A number.
+
+ Returns:
+
+ The result of scaling this complex to a factor.
+ */
+ $div: function(pos) {
+ var x = this.x, y = this.y;
+ var sq = pos.squaredNorm();
+ this.x = x * pos.x + y * pos.y; this.y = y * pos.x - x * pos.y;
+ return this.$scale(1 / sq);
+ }
+};
+
+var $C = function(a, b) { return new Complex(a, b); };
+
+Complex.KER = $C(0, 0);
+
+
+
+/*
+ * File: Graph.js
+ *
+ * Generic , and classes.
+ *
+ * Used by:
+ *
+ * , and .
+ *
+*/
+
+/*
+ Class: Graph
+
+ A generic Graph class.
+
+ Description:
+
+ When a json graph/tree structure is loaded by , an internal representation is created.
+
+ In most cases you'll be dealing with an already created structure, so methods like or won't
+ be of many use. However methods like and are pretty useful.
+
+ provides also iterators for and advanced and useful graph operations and methods.
+
+ Used by:
+
+ , , and .
+
+ Access:
+
+ An instance of this class can be accessed by using the _graph_ parameter of a , or instance
+
+ Example:
+
+ (start code js)
+ var st = new ST(canvas, config);
+ st.graph.getNode //or any other method.
+
+ var ht = new Hypertree(canvas, config);
+ ht.graph.getNode //or any other method.
+
+ var rg = new RGraph(canvas, config);
+ rg.graph.getNode //or any other method.
+ (end code)
+
+*/
+
+this.Graph = new Class({
+
+ initialize: function(opt) {
+ var innerOptions = {
+ 'complex': false,
+ 'Node': {}
+ };
+ this.opt = $merge(innerOptions, opt || {});
+ this.nodes= {};
+ },
+
+/*
+ Method: getNode
+
+ Returns a by _id_.
+
+ Parameters:
+
+ id - A id.
+
+ Returns:
+
+ A having _id_ as id. Returns *false* otherwise.
+
+ Example:
+
+ (start code js)
+ var node = graph.getNode('someid');
+ (end code)
+*/
+ getNode: function(id) {
+ if(this.hasNode(id)) return this.nodes[id];
+ return false;
+ },
+
+/*
+ Method: getAdjacence
+
+ Returns an array of objects connecting nodes with ids _id_ and _id2_.
+
+ Parameters:
+
+ id - A id.
+ id2 - A id.
+
+ Returns:
+
+ An Array of objects. Returns *false* if there's not a connecting those two nodes.
+*/
+ getAdjacence: function (id, id2) {
+ var adjs = [];
+ if(this.hasNode(id) && this.hasNode(id2)
+ && this.nodes[id].adjacentTo({ 'id':id2 }) && this.nodes[id2].adjacentTo({ 'id':id })) {
+ adjs.push(this.nodes[id].getAdjacency(id2));
+ adjs.push(this.nodes[id2].getAdjacency(id));
+ return adjs;
+ }
+ return false;
+ },
+
+ /*
+ Method: addNode
+
+ Adds a node.
+
+ Parameters:
+
+ obj - An object containing as properties
+
+ - _id_ node's id
+ - _name_ node's name
+ - _data_ node's data hash
+
+ See also:
+
+
+ */
+ addNode: function(obj) {
+ if(!this.nodes[obj.id]) {
+ this.nodes[obj.id] = new Graph.Node($extend({
+ 'id': obj.id,
+ 'name': obj.name,
+ 'data': obj.data
+ }, this.opt.Node), this.opt.complex);
+ }
+ return this.nodes[obj.id];
+ },
+
+ /*
+ Method: addAdjacence
+
+ Connects nodes specified by _obj_ and _obj2_. If not found, nodes are created.
+
+ Parameters:
+
+ obj - a object.
+ obj2 - Another object.
+ data - A DataSet object. Used to store some extra information in the object created.
+
+ See also:
+
+ ,
+ */
+ addAdjacence: function (obj, obj2, data) {
+ var adjs = []
+ if(!this.hasNode(obj.id)) this.addNode(obj);
+ if(!this.hasNode(obj2.id)) this.addNode(obj2);
+ obj = this.nodes[obj.id]; obj2 = this.nodes[obj2.id];
+
+ for(var i in this.nodes) {
+ if(this.nodes[i].id == obj.id) {
+ if(!this.nodes[i].adjacentTo(obj2)) {
+ adjs.push(this.nodes[i].addAdjacency(obj2, data));
+ }
+ }
+
+ if(this.nodes[i].id == obj2.id) {
+ if(!this.nodes[i].adjacentTo(obj)) {
+ adjs.push(this.nodes[i].addAdjacency(obj, data));
+ }
+ }
+ }
+ return adjs;
+ },
+
+ /*
+ Method: removeNode
+
+ Removes a matching the specified _id_.
+
+ Parameters:
+
+ id - A node's id.
+
+ */
+ removeNode: function(id) {
+ if(this.hasNode(id)) {
+ var node = this.nodes[id];
+ for(var i=0 in node.adjacencies) {
+ var adj = node.adjacencies[i];
+ this.removeAdjacence(id, adj.nodeTo.id);
+ }
+ delete this.nodes[id];
+ }
+ },
+
+/*
+ Method: removeAdjacence
+
+ Removes a matching _id1_ and _id2_.
+
+ Parameters:
+
+ id1 - A id.
+ id2 - A id.
+*/
+ removeAdjacence: function(id1, id2) {
+ if(this.hasNode(id1)) this.nodes[id1].removeAdjacency(id2);
+ if(this.hasNode(id2)) this.nodes[id2].removeAdjacency(id1);
+ },
+
+ /*
+ Method: hasNode
+
+ Returns a Boolean instance indicating if the node belongs to the or not.
+
+ Parameters:
+
+ id - Node id.
+
+ Returns:
+
+ A Boolean instance indicating if the node belongs to the graph or not.
+ */
+ hasNode: function(id) {
+ return id in this.nodes;
+ }
+});
+
+/*
+ Class: Graph.Node
+
+ A node.
+
+ Parameters:
+
+ obj - An object containing an 'id', 'name' and 'data' properties as described in .
+ complex - Whether node position properties should contain or instances.
+
+ See also:
+
+
+
+ Description:
+
+ An instance of is usually passed as parameter for most configuration/controller methods in the
+ , and classes.
+
+ A object has as properties
+
+ id - Node id.
+ name - Node name.
+ data - Node data property containing a hash (i.e {}) with custom options. For more information see .
+ selected - Whether the node is selected or not. Used by for selecting nodes that are between the root node and the selected node.
+ angleSpan - For radial layouts such as the ones performed by the and the . Contains _begin_ and _end_ properties containing angle values describing the angle span for this subtree.
+ alpha - Current opacity value.
+ startAlpha - Opacity begin value. Used for interpolation.
+ endAlpha - Opacity end value. Used for interpolation.
+ pos - Current position. Can be a or instance.
+ startPos - Starting position. Used for interpolation.
+ endPos - Ending position. Used for interpolation.
+*/
+Graph.Node = new Class({
+
+ initialize: function(opt, complex) {
+ var innerOptions = {
+ 'id': '',
+ 'name': '',
+ 'data': {},
+ 'adjacencies': {},
+
+ 'selected': false,
+ 'drawn': false,
+ 'exist': false,
+
+ 'angleSpan': {
+ 'begin': 0,
+ 'end' : 0
+ },
+
+ 'alpha': 1,
+ 'startAlpha': 1,
+ 'endAlpha': 1,
+
+ 'pos': (complex && $C(0, 0)) || $P(0, 0),
+ 'startPos': (complex && $C(0, 0)) || $P(0, 0),
+ 'endPos': (complex && $C(0, 0)) || $P(0, 0)
+ };
+
+ $extend(this, $extend(innerOptions, opt));
+ },
+
+ /*
+ Method: adjacentTo
+
+ Indicates if the node is adjacent to the node specified by id
+
+ Parameters:
+
+ id - A node id.
+
+ Returns:
+
+ A Boolean instance indicating whether this node is adjacent to the specified by id or not.
+
+ Example:
+ (start code js)
+ node.adjacentTo('mynodeid');
+ (end code)
+ */
+ adjacentTo: function(node) {
+ return node.id in this.adjacencies;
+ },
+
+ /*
+ Method: getAdjacency
+
+ Returns a object connecting the current and the node having _id_ as id.
+
+ Parameters:
+
+ id - A node id.
+
+ Returns:
+
+ A object or undefined.
+ */
+ getAdjacency: function(id) {
+ return this.adjacencies[id];
+ },
+ /*
+ Method: addAdjacency
+
+ Connects the current node and the given node.
+
+ Parameters:
+
+ node - A .
+ data - Some custom hash information.
+ */
+ addAdjacency: function(node, data) {
+ var adj = new Graph.Adjacence(this, node, data);
+ return this.adjacencies[node.id] = adj;
+ },
+
+ /*
+ Method: removeAdjacency
+
+ Removes a by _id_.
+
+ Parameters:
+
+ id - A node id.
+ */
+ removeAdjacency: function(id) {
+ delete this.adjacencies[id];
+ }
+});
+
+/*
+ Class: Graph.Adjacence
+
+ A adjacence (or edge). Connects two .
+
+ Parameters:
+
+ nodeFrom - A .
+ nodeTo - A .
+ data - Some custom hash data.
+
+ See also:
+
+
+
+ Description:
+
+ An instance of is usually passed as parameter for some configuration/controller methods in the
+ , and classes.
+
+ A object has as properties
+
+ nodeFrom - A connected by this edge.
+ nodeTo - Another connected by this edge.
+ data - Node data property containing a hash (i.e {}) with custom options. For more information see .
+ alpha - Current opacity value.
+ startAlpha - Opacity begin value. Used for interpolation.
+ endAlpha - Opacity end value. Used for interpolation.
+*/
+Graph.Adjacence = function(nodeFrom, nodeTo, data) {
+ this.nodeFrom = nodeFrom;
+ this.nodeTo = nodeTo;
+ this.data = data || {};
+ this.alpha = 1;
+ this.startAlpha = 1;
+ this.endAlpha = 1;
+};
+
+/*
+ Object: Graph.Util
+
+ traversal and processing utility object.
+*/
+Graph.Util = {
+ /*
+ filter
+
+ For internal use only. Provides a filtering function based on flags.
+ */
+ filter: function(param) {
+ if(!param || !($type(param) == 'string')) return function() { return true; };
+ var props = param.split(" ");
+ return function(elem) {
+ for(var i=0; i by _id_.
+
+ Parameters:
+
+ graph - A instance.
+ id - A id.
+
+ Returns:
+
+ A node.
+
+ Example:
+
+ (start code js)
+ Graph.Util.getNode(graph, 'nodeid');
+ (end code)
+ */
+ getNode: function(graph, id) {
+ return graph.getNode(id);
+ },
+
+ /*
+ Method: eachNode
+
+ Iterates over nodes performing an _action_.
+
+ Parameters:
+
+ graph - A instance.
+ action - A callback function having a as first formal parameter.
+
+ Example:
+ (start code js)
+ Graph.Util.each(graph, function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachNode: function(graph, action, flags) {
+ var filter = this.filter(flags);
+ for(var i in graph.nodes) if(filter(graph.nodes[i])) action(graph.nodes[i]);
+ },
+
+ /*
+ Method: eachAdjacency
+
+ Iterates over adjacencies applying the _action_ function.
+
+ Parameters:
+
+ node - A .
+ action - A callback function having as first formal parameter.
+
+ Example:
+ (start code js)
+ Graph.Util.eachAdjacency(node, function(adj) {
+ alert(adj.nodeTo.name);
+ });
+ (end code)
+ */
+ eachAdjacency: function(node, action, flags) {
+ var adj = node.adjacencies, filter = this.filter(flags);
+ for(var id in adj) if(filter(adj[id])) action(adj[id], id);
+ },
+
+ /*
+ Method: computeLevels
+
+ Performs a BFS traversal setting the correct depth for each node.
+
+ The depth of each node can then be accessed by
+ >node._depth
+
+ Parameters:
+
+ graph - A .
+ id - A starting node id for the BFS traversal.
+ startDepth - _optional_ A minimum depth value. Default's 0.
+
+ */
+ computeLevels: function(graph, id, startDepth, flags) {
+ startDepth = startDepth || 0;
+ var filter = this.filter(flags);
+ this.eachNode(graph, function(elem) {
+ elem._flag = false;
+ elem._depth = -1;
+ }, flags);
+ var root = graph.getNode(id);
+ root._depth = startDepth;
+ var queue = [root];
+ while(queue.length != 0) {
+ var node = queue.pop();
+ node._flag = true;
+ this.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._flag == false && filter(n)) {
+ if(n._depth < 0) n._depth = node._depth + 1 + startDepth;
+ queue.unshift(n);
+ }
+ }, flags);
+ }
+ },
+
+ /*
+ Method: eachBFS
+
+ Performs a BFS traversal applying _action_ to each .
+
+ Parameters:
+
+ graph - A .
+ id - A starting node id for the BFS traversal.
+ action - A callback function having a as first formal parameter.
+
+ Example:
+ (start code js)
+ Graph.Util.eachBFS(graph, 'mynodeid', function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachBFS: function(graph, id, action, flags) {
+ var filter = this.filter(flags);
+ this.clean(graph);
+ var queue = [graph.getNode(id)];
+ while(queue.length != 0) {
+ var node = queue.pop();
+ node._flag = true;
+ action(node, node._depth);
+ this.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._flag == false && filter(n)) {
+ n._flag = true;
+ queue.unshift(n);
+ }
+ }, flags);
+ }
+ },
+
+ /*
+ Method: eachLevel
+
+ Iterates over a node's subgraph applying _action_ to the nodes of relative depth between _levelBegin_ and _levelEnd_.
+
+ Parameters:
+
+ node - A .
+ levelBegin - A relative level value.
+ levelEnd - A relative level value.
+ action - A callback function having a as first formal parameter.
+
+ */
+ eachLevel: function(node, levelBegin, levelEnd, action, flags) {
+ var d = node._depth, filter = this.filter(flags), that = this;
+ levelEnd = levelEnd === false? Number.MAX_VALUE -d : levelEnd;
+ (function loopLevel(node, levelBegin, levelEnd) {
+ var d = node._depth;
+ if(d >= levelBegin && d <= levelEnd && filter(node)) action(node, d);
+ if(d < levelEnd) {
+ that.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._depth > d) loopLevel(n, levelBegin, levelEnd);
+ });
+ }
+ })(node, levelBegin + d, levelEnd + d);
+ },
+
+ /*
+ Method: eachSubgraph
+
+ Iterates over a node's children recursively.
+
+ Parameters:
+ node - A .
+ action - A callback function having a as first formal parameter.
+
+ Example:
+ (start code js)
+ Graph.Util.eachSubgraph(node, function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachSubgraph: function(node, action, flags) {
+ this.eachLevel(node, 0, false, action, flags);
+ },
+
+ /*
+ Method: eachSubnode
+
+ Iterates over a node's children (without deeper recursion).
+
+ Parameters:
+ node - A .
+ action - A callback function having a as first formal parameter.
+
+ Example:
+ (start code js)
+ Graph.Util.eachSubnode(node, function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachSubnode: function(node, action, flags) {
+ this.eachLevel(node, 1, 1, action, flags);
+ },
+
+ /*
+ Method: anySubnode
+
+ Returns *true* if any subnode matches the given condition.
+
+ Parameters:
+ node - A .
+ cond - A callback function returning a Boolean instance. This function has as first formal parameter a .
+
+ Returns:
+ A boolean value.
+
+ Example:
+ (start code js)
+ Graph.Util.anySubnode(node, function(node) { return node.name == "mynodename"; });
+ (end code)
+ */
+ anySubnode: function(node, cond, flags) {
+ var flag = false;
+ cond = cond || $lambda(true);
+ var c = $type(cond) == 'string'? function(n) { return n[cond]; } : cond;
+ this.eachSubnode(node, function(elem) {
+ if(c(elem)) flag = true;
+ }, flags);
+ return flag;
+ },
+
+ /*
+ Method: getSubnodes
+
+ Collects all subnodes for a specified node. The _level_ parameter filters nodes having relative depth of _level_ from the root node.
+
+ Parameters:
+ node - A .
+ level - _optional_ A starting relative depth for collecting nodes. Default's 0.
+
+ Returns:
+ An array of nodes.
+
+ */
+ getSubnodes: function(node, level, flags) {
+ var ans = [], that = this;
+ level = level || 0;
+ if($type(level) == 'array') {
+ var levelStart = level[0];
+ var levelEnd = level[1];
+ } else {
+ var levelStart = level;
+ var levelEnd = Number.MAX_VALUE - node._depth;
+ }
+ this.eachLevel(node, levelStart, levelEnd, function(n) {
+ ans.push(n);
+ }, flags);
+ return ans;
+ },
+
+
+ /*
+ Method: getParents
+
+ Returns an Array of wich are parents of the given node.
+
+ Parameters:
+ node - A .
+
+ Returns:
+ An Array of .
+
+ Example:
+ (start code js)
+ var pars = Graph.Util.getParents(node);
+ if(pars.length > 0) {
+ //do stuff with parents
+ }
+ (end code)
+ */
+ getParents: function(node) {
+ var ans = [];
+ this.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._depth < node._depth) ans.push(n);
+ });
+ return ans;
+ },
+
+ /*
+ Method: clean
+
+ Cleans flags from nodes (by setting the _flag_ property to false).
+
+ Parameters:
+ graph - A instance.
+ */
+ clean: function(graph) { this.eachNode(graph, function(elem) { elem._flag = false; }); }
+};
+
+
+
+/*
+ * File: Graph.Op.js
+ *
+ * Defines an abstract class for performing Operations.
+*/
+
+/*
+ Object: Graph.Op
+
+ Generic Operations.
+
+ Description:
+
+ An abstract class holding unary and binary powerful graph operations such as removingNodes, removingEdges, adding two graphs and morphing.
+
+ Implemented by:
+
+ , and .
+
+ Access:
+
+ The subclasses for this abstract class can be accessed by using the _op_ property of the