Best Python code snippet using Kiwi_python
tablepropertiesui.js
Source:tablepropertiesui.js  
1/**2 * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.3 * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license4 */5/* globals document, Event */6import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor';7import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';8import { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';9import { getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';10import Undo from '@ckeditor/ckeditor5-undo/src/undo';11import Batch from '@ckeditor/ckeditor5-engine/src/model/batch';12import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';13import ButtonView from '@ckeditor/ckeditor5-ui/src/button/buttonview';14import ContextualBalloon from '@ckeditor/ckeditor5-ui/src/panel/balloon/contextualballoon';15import Table from '../../src/table';16import TablePropertiesEditing from '../../src/tableproperties/tablepropertiesediting';17import TablePropertiesUI from '../../src/tableproperties/tablepropertiesui';18import TablePropertiesUIView from '../../src/tableproperties/ui/tablepropertiesview';19import { defaultColors } from '../../src/utils/ui/table-properties';20describe( 'table properties', () => {21	describe( 'TablePropertiesUI', () => {22		let editor, editorElement, contextualBalloon,23			tablePropertiesUI, tablePropertiesView, tablePropertiesButton,24			clock;25		testUtils.createSinonSandbox();26		beforeEach( () => {27			clock = sinon.useFakeTimers();28			editorElement = document.createElement( 'div' );29			document.body.appendChild( editorElement );30			return ClassicTestEditor31				.create( editorElement, {32					plugins: [ Table, TablePropertiesEditing, TablePropertiesUI, Paragraph, Undo ],33					initialData: '<table><tr><td>foo</td></tr></table><p>bar</p>'34				} )35				.then( newEditor => {36					editor = newEditor;37					tablePropertiesUI = editor.plugins.get( TablePropertiesUI );38					tablePropertiesButton = editor.ui.componentFactory.create( 'tableProperties' );39					contextualBalloon = editor.plugins.get( ContextualBalloon );40					tablePropertiesView = tablePropertiesUI.view;41					// There is no point to execute BalloonPanelView attachTo and pin methods so lets override it.42					testUtils.sinon.stub( contextualBalloon.view, 'attachTo' ).returns( {} );43					testUtils.sinon.stub( contextualBalloon.view, 'pin' ).returns( {} );44				} );45		} );46		afterEach( () => {47			clock.restore();48			editorElement.remove();49			return editor.destroy();50		} );51		it( 'should be named', () => {52			expect( TablePropertiesUI.pluginName ).to.equal( 'TablePropertiesUI' );53		} );54		it( 'should load ContextualBalloon', () => {55			expect( editor.plugins.get( ContextualBalloon ) ).to.be.instanceOf( ContextualBalloon );56		} );57		describe( 'constructor()', () => {58			it( 'should define table.tableProperties config', () => {59				expect( editor.config.get( 'table.tableProperties' ) ).to.deep.equal( {60					borderColors: defaultColors,61					backgroundColors: defaultColors62				} );63			} );64		} );65		describe( 'init()', () => {66			it( 'should set a batch', () => {67				expect( tablePropertiesUI._undoStepBatch ).to.be.null;68			} );69			describe( '#view', () => {70				it( 'should be created', () => {71					expect( tablePropertiesUI.view ).to.be.instanceOf( TablePropertiesUIView );72				} );73				it( 'should be rendered', () => {74					expect( tablePropertiesUI.view.isRendered ).to.be.true;75				} );76				it( 'should get the border colors configurations', () => {77					expect( tablePropertiesView.options.borderColors ).to.have.length( 15 );78				} );79				it( 'should get the background colors configurations', () => {80					expect( tablePropertiesView.options.backgroundColors ).to.have.length( 15 );81				} );82			} );83			describe( 'toolbar button', () => {84				it( 'should be registered', () => {85					expect( tablePropertiesButton ).to.be.instanceOf( ButtonView );86				} );87				it( 'should have a label', () => {88					expect( tablePropertiesButton.label ).to.equal( 'Table properties' );89				} );90				it( 'should have a tooltip', () => {91					expect( tablePropertiesButton.tooltip ).to.be.true;92				} );93				it( 'should call #_showView upon #execute', () => {94					const spy = testUtils.sinon.stub( tablePropertiesUI, '_showView' ).returns( {} );95					tablePropertiesButton.fire( 'execute' );96					sinon.assert.calledOnce( spy );97				} );98				it( 'should be disabled if all of the table properties commands are disabled', () => {99					[100						'tableBorderStyle',101						'tableBorderColor',102						'tableBorderWidth',103						'tableBackgroundColor',104						'tableWidth',105						'tableHeight',106						'tableAlignment'107					].forEach( command => {108						editor.commands.get( command ).isEnabled = false;109					} );110					expect( tablePropertiesButton.isEnabled ).to.be.false;111					editor.commands.get( 'tableBackgroundColor' ).isEnabled = true;112					expect( tablePropertiesButton.isEnabled ).to.be.true;113				} );114			} );115		} );116		describe( 'destroy()', () => {117			it( 'should destroy the #view', () => {118				const spy = sinon.spy( tablePropertiesView, 'destroy' );119				tablePropertiesUI.destroy();120				sinon.assert.calledOnce( spy );121			} );122		} );123		describe( 'Properties #view', () => {124			beforeEach( () => {125				editor.model.change( writer => {126					writer.setSelection( editor.model.document.getRoot().getChild( 0 ).getChild( 0 ).getChild( 0 ), 0 );127				} );128			} );129			it( 'should hide on #submit', () => {130				tablePropertiesButton.fire( 'execute' );131				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );132				tablePropertiesView.fire( 'submit' );133				expect( contextualBalloon.visibleView ).to.be.null;134			} );135			describe( '#cancel event', () => {136				// https://github.com/ckeditor/ckeditor5/issues/6180137				it( 'should not undo if it there were no changes made to the property fields', () => {138					const spy = sinon.spy( editor, 'execute' );139					// Show the view. New batch will be created.140					tablePropertiesButton.fire( 'execute' );141					// Cancel the view immediately.142					tablePropertiesView.fire( 'cancel' );143					sinon.assert.notCalled( spy );144				} );145				it( 'should undo the entire batch of changes if there were some', () => {146					const spy = sinon.spy( editor, 'execute' );147					// Show the view. New batch will be created.148					tablePropertiesButton.fire( 'execute' );149					// Do the changes like a user.150					tablePropertiesView.borderStyle = 'dotted';151					tablePropertiesView.backgroundColor = 'red';152					expect( getModelData( editor.model ) ).to.equal(153						'<table backgroundColor="red" borderStyle="dotted">' +154							'<tableRow>' +155								'<tableCell>' +156									'<paragraph>[]foo</paragraph>' +157								'</tableCell>' +158							'</tableRow>' +159						'</table>' +160						'<paragraph>bar</paragraph>'161					);162					tablePropertiesView.fire( 'cancel' );163					expect( getModelData( editor.model ) ).to.equal(164						'<table>' +165							'<tableRow>' +166								'<tableCell>' +167									'<paragraph>[]foo</paragraph>' +168								'</tableCell>' +169							'</tableRow>' +170						'</table>' +171						'<paragraph>bar</paragraph>'172					);173					sinon.assert.calledWith( spy, 'undo', tablePropertiesUI._undoStepBatch );174				} );175				it( 'should hide the view', () => {176					tablePropertiesButton.fire( 'execute' );177					expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );178					tablePropertiesView.fire( 'cancel' );179					expect( contextualBalloon.visibleView ).to.be.null;180				} );181			} );182			it( 'should hide on the Esc key press', () => {183				const keyEvtData = {184					keyCode: keyCodes.esc,185					preventDefault: sinon.spy(),186					stopPropagation: sinon.spy()187				};188				tablePropertiesButton.fire( 'execute' );189				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );190				tablePropertiesView.keystrokes.press( keyEvtData );191				expect( contextualBalloon.visibleView ).to.be.null;192			} );193			it( 'should hide if the table is no longer selected on EditorUI#update', () => {194				tablePropertiesButton.fire( 'execute' );195				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );196				editor.model.change( writer => {197					// Set selection in the paragraph.198					writer.setSelection( editor.model.document.getRoot().getChild( 1 ), 0 );199				} );200				expect( contextualBalloon.visibleView ).to.be.null;201			} );202			it( 'should reposition if table is still selected on on EditorUI#update', () => {203				tablePropertiesButton.fire( 'execute' );204				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );205				editor.model.change( writer => {206					writer.insertText( 'qux', editor.model.document.selection.getFirstPosition() );207				} );208				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );209			} );210			it( 'should hide if clicked outside the balloon', () => {211				tablePropertiesButton.fire( 'execute' );212				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );213				document.body.dispatchEvent( new Event( 'mousedown', { bubbles: true } ) );214				expect( contextualBalloon.visibleView ).to.be.null;215			} );216			describe( 'property changes', () => {217				beforeEach( () => {218					tablePropertiesUI._undoStepBatch = 'foo';219				} );220				describe( '#borderStyle', () => {221					it( 'should affect the editor state', () => {222						const spy = testUtils.sinon.stub( editor, 'execute' );223						tablePropertiesView.borderStyle = 'dotted';224						sinon.assert.calledOnce( spy );225						sinon.assert.calledWithExactly( spy, 'tableBorderStyle', { value: 'dotted', batch: 'foo' } );226					} );227				} );228				describe( '#borderColor', () => {229					it( 'should affect the editor state', () => {230						const spy = testUtils.sinon.stub( editor, 'execute' );231						tablePropertiesView.borderColor = '#FFAAFF';232						sinon.assert.calledOnce( spy );233						sinon.assert.calledWithExactly( spy, 'tableBorderColor', { value: '#FFAAFF', batch: 'foo' } );234					} );235					it( 'should display an error message if value is invalid', () => {236						const spy = testUtils.sinon.stub( editor, 'execute' );237						// First, let's pass an invalid value and check what happens.238						tablePropertiesView.borderColor = '42';239						clock.tick( 500 );240						expect( tablePropertiesView.borderColorInput.errorText ).to.match( /^The color is invalid/ );241						sinon.assert.notCalled( spy );242						// And now let's pass a valid value and check if the error text will be gone.243						tablePropertiesView.borderColor = '#AAA';244						clock.tick( 500 );245						expect( tablePropertiesView.borderColorInput.errorText ).to.be.null;246						sinon.assert.calledWithExactly( spy, 'tableBorderColor', { value: '#AAA', batch: 'foo' } );247					} );248				} );249				describe( '#borderWidth', () => {250					it( 'should affect the editor state', () => {251						const spy = testUtils.sinon.stub( editor, 'execute' );252						tablePropertiesView.borderWidth = '12px';253						sinon.assert.calledOnce( spy );254						sinon.assert.calledWithExactly( spy, 'tableBorderWidth', { value: '12px', batch: 'foo' } );255					} );256					it( 'should display an error message if value is invalid', () => {257						const spy = testUtils.sinon.stub( editor, 'execute' );258						// First, let's pass an invalid value and check what happens.259						tablePropertiesView.borderWidth = 'wrong';260						clock.tick( 500 );261						expect( tablePropertiesView.borderWidthInput.errorText ).to.match( /^The value is invalid/ );262						sinon.assert.notCalled( spy );263						// And now let's pass a valid value and check if the error text will be gone.264						tablePropertiesView.borderWidth = '3em';265						clock.tick( 500 );266						expect( tablePropertiesView.backgroundInput.errorText ).to.be.null;267						sinon.assert.calledWithExactly( spy, 'tableBorderWidth', { value: '3em', batch: 'foo' } );268					} );269				} );270				describe( '#backgroundColor', () => {271					it( 'should affect the editor state', () => {272						const spy = testUtils.sinon.stub( editor, 'execute' );273						tablePropertiesView.backgroundColor = '#FFAAFF';274						sinon.assert.calledOnce( spy );275						sinon.assert.calledWithExactly( spy, 'tableBackgroundColor', { value: '#FFAAFF', batch: 'foo' } );276					} );277					it( 'should display an error message if value is invalid', () => {278						const spy = testUtils.sinon.stub( editor, 'execute' );279						// First, let's pass an invalid value and check what happens.280						tablePropertiesView.backgroundColor = '42';281						clock.tick( 500 );282						expect( tablePropertiesView.backgroundInput.errorText ).to.match( /^The color is invalid/ );283						sinon.assert.notCalled( spy );284						// And now let's pass a valid value and check if the error text will be gone.285						tablePropertiesView.backgroundColor = '#AAA';286						clock.tick( 500 );287						expect( tablePropertiesView.backgroundInput.errorText ).to.be.null;288						sinon.assert.calledWithExactly( spy, 'tableBackgroundColor', { value: '#AAA', batch: 'foo' } );289					} );290				} );291				describe( '#width', () => {292					it( 'should affect the editor state', () => {293						const spy = testUtils.sinon.stub( editor, 'execute' );294						tablePropertiesView.width = '12px';295						sinon.assert.calledOnce( spy );296						sinon.assert.calledWithExactly( spy, 'tableWidth', { value: '12px', batch: 'foo' } );297					} );298					it( 'should display an error message if value is invalid', () => {299						const spy = testUtils.sinon.stub( editor, 'execute' );300						// First, let's pass an invalid value and check what happens.301						tablePropertiesView.width = 'wrong';302						clock.tick( 500 );303						expect( tablePropertiesView.widthInput.errorText ).to.match( /^The value is invalid/ );304						sinon.assert.notCalled( spy );305						// And now let's pass a valid value and check if the error text will be gone.306						tablePropertiesView.width = '3em';307						clock.tick( 500 );308						expect( tablePropertiesView.backgroundInput.errorText ).to.be.null;309						sinon.assert.calledWithExactly( spy, 'tableWidth', { value: '3em', batch: 'foo' } );310					} );311				} );312				describe( '#height', () => {313					it( 'should affect the editor state', () => {314						const spy = testUtils.sinon.stub( editor, 'execute' );315						tablePropertiesView.height = '12px';316						sinon.assert.calledOnce( spy );317						sinon.assert.calledWithExactly( spy, 'tableHeight', { value: '12px', batch: 'foo' } );318					} );319					it( 'should display an error message if value is invalid', () => {320						const spy = testUtils.sinon.stub( editor, 'execute' );321						// First, let's pass an invalid value and check what happens.322						tablePropertiesView.height = 'wrong';323						clock.tick( 500 );324						expect( tablePropertiesView.heightInput.errorText ).to.match( /^The value is invalid/ );325						sinon.assert.notCalled( spy );326						// And now let's pass a valid value and check if the error text will be gone.327						tablePropertiesView.height = '3em';328						clock.tick( 500 );329						expect( tablePropertiesView.backgroundInput.errorText ).to.be.null;330						sinon.assert.calledWithExactly( spy, 'tableHeight', { value: '3em', batch: 'foo' } );331					} );332				} );333				describe( '#alignment', () => {334					it( 'should affect the editor state', () => {335						const spy = testUtils.sinon.stub( editor, 'execute' );336						tablePropertiesView.alignment = 'right';337						sinon.assert.calledOnce( spy );338						sinon.assert.calledWithExactly( spy, 'tableAlignment', { value: 'right', batch: 'foo' } );339					} );340				} );341				it( 'should not display an error text if user managed to fix the value before the UI timeout', () => {342					// First, let's pass an invalid value.343					tablePropertiesView.borderColor = '#';344					clock.tick( 100 );345					// Then the user managed to quickly type the correct value.346					tablePropertiesView.borderColor = '#aaa';347					clock.tick( 400 );348					// Because they were quick, they should see no error349					expect( tablePropertiesView.borderColorInput.errorText ).to.be.null;350				} );351				it( 'should not affect the editor state if internal property has changed', () => {352					const spy = testUtils.sinon.stub( editor, 'execute' );353					tablePropertiesView.set( 'internalProp', 'foo' );354					tablePropertiesView.internalProp = 'bar';355					sinon.assert.notCalled( spy );356				} );357			} );358		} );359		describe( 'Showing the #view', () => {360			beforeEach( () => {361				editor.model.change( writer => {362					writer.setSelection( editor.model.document.getRoot().getChild( 0 ).getChild( 0 ).getChild( 0 ), 0 );363				} );364			} );365			it( 'should create a new undoable batch for further #view cancel', () => {366				tablePropertiesButton.fire( 'execute' );367				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );368				const firstBatch = tablePropertiesUI._undoStepBatch;369				expect( firstBatch ).to.be.instanceOf( Batch );370				tablePropertiesView.fire( 'submit' );371				expect( contextualBalloon.visibleView ).to.be.null;372				tablePropertiesButton.fire( 'execute' );373				const secondBatch = tablePropertiesUI._undoStepBatch;374				expect( secondBatch ).to.be.instanceOf( Batch );375				expect( firstBatch ).to.not.equal( secondBatch );376			} );377			describe( 'initial data', () => {378				it( 'should be set from the command values', () => {379					editor.commands.get( 'tableBorderStyle' ).value = 'a';380					editor.commands.get( 'tableBorderColor' ).value = 'b';381					editor.commands.get( 'tableBorderWidth' ).value = 'c';382					editor.commands.get( 'tableBackgroundColor' ).value = 'd';383					editor.commands.get( 'tableWidth' ).value = 'e';384					editor.commands.get( 'tableHeight' ).value = 'f';385					editor.commands.get( 'tableAlignment' ).value = 'g';386					tablePropertiesButton.fire( 'execute' );387					expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );388					expect( tablePropertiesView ).to.include( {389						borderStyle: 'a',390						borderColor: 'b',391						borderWidth: 'c',392						backgroundColor: 'd',393						width: 'e',394						height: 'f',395						alignment: 'g'396					} );397				} );398				it( 'should use default values when command has no value', () => {399					editor.commands.get( 'tableBorderStyle' ).value = null;400					editor.commands.get( 'tableBorderColor' ).value = null;401					editor.commands.get( 'tableBorderWidth' ).value = null;402					editor.commands.get( 'tableBackgroundColor' ).value = null;403					editor.commands.get( 'tableWidth' ).value = null;404					editor.commands.get( 'tableHeight' ).value = null;405					editor.commands.get( 'tableAlignment' ).value = null;406					tablePropertiesButton.fire( 'execute' );407					expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );408					expect( tablePropertiesView ).to.include( {409						borderStyle: '',410						borderColor: '',411						borderWidth: '',412						backgroundColor: '',413						width: '',414						height: '',415						alignment: ''416					} );417				} );418			} );419			it( 'should focus the form view', () => {420				const spy = testUtils.sinon.spy( tablePropertiesView, 'focus' );421				tablePropertiesButton.fire( 'execute' );422				sinon.assert.calledOnce( spy );423			} );424		} );425		describe( 'Hiding the #view', () => {426			beforeEach( () => {427				editor.model.change( writer => {428					writer.setSelection( editor.model.document.getRoot().getChild( 0 ).getChild( 0 ).getChild( 0 ), 0 );429				} );430			} );431			it( 'should stop listening to EditorUI#update', () => {432				const spy = testUtils.sinon.spy( tablePropertiesUI, 'stopListening' );433				tablePropertiesButton.fire( 'execute' );434				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );435				tablePropertiesView.fire( 'submit' );436				expect( contextualBalloon.visibleView ).to.be.null;437				sinon.assert.calledOnce( spy );438				sinon.assert.calledWithExactly( spy, editor.ui, 'update' );439			} );440			it( 'should focus the editing view so the focus is not lost', () => {441				const spy = testUtils.sinon.spy( editor.editing.view, 'focus' );442				tablePropertiesButton.fire( 'execute' );443				expect( contextualBalloon.visibleView ).to.equal( tablePropertiesView );444				tablePropertiesView.fire( 'submit' );445				sinon.assert.calledOnce( spy );446			} );447		} );448	} );...additional_properties.js
Source:additional_properties.js  
1// @tags: [requires_non_retryable_commands]2/**3 * Tests for the JSON Schema 'additionalProperties' keyword.4 */5(function() {6    "use strict";7    load("jstests/libs/assert_schema_match.js");8    const coll = db.schema_allowed_properties;9    // Tests for {additionalProperties:false} at the top level.10    assertSchemaMatch(11        coll, {properties: {_id: {}, a: {}}, additionalProperties: false}, {_id: 1}, true);12    assertSchemaMatch(13        coll, {properties: {_id: {}, a: {}}, additionalProperties: false}, {_id: 1, a: 1}, true);14    assertSchemaMatch(15        coll, {properties: {_id: {}, a: {}}, additionalProperties: false}, {_id: 1, b: 1}, false);16    assertSchemaMatch(coll,17                      {properties: {_id: {}, a: {}}, additionalProperties: false},18                      {_id: 1, a: 1, b: 1},19                      false);20    // Tests for {additionalProperties:true} at the top level.21    assertSchemaMatch(22        coll, {properties: {_id: {}, a: {}}, additionalProperties: true}, {_id: 1}, true);23    assertSchemaMatch(24        coll, {properties: {_id: {}, a: {}}, additionalProperties: true}, {_id: 1, a: 1}, true);25    assertSchemaMatch(26        coll, {properties: {_id: {}, a: {}}, additionalProperties: true}, {_id: 1, b: 1}, true);27    assertSchemaMatch(coll,28                      {properties: {_id: {}, a: {}}, additionalProperties: true},29                      {_id: 1, a: 1, b: 1},30                      true);31    // Tests for additionalProperties with a nested schema at the top level.32    assertSchemaMatch(coll,33                      {properties: {_id: {}, a: {}}, additionalProperties: {type: "number"}},34                      {_id: 1},35                      true);36    assertSchemaMatch(coll,37                      {properties: {_id: {}, a: {}}, additionalProperties: {type: "number"}},38                      {_id: 1, a: 1},39                      true);40    assertSchemaMatch(coll,41                      {properties: {_id: {}, a: {}}, additionalProperties: {type: "number"}},42                      {_id: 1, b: 1},43                      true);44    assertSchemaMatch(coll,45                      {properties: {_id: {}, a: {}}, additionalProperties: {type: "number"}},46                      {_id: 1, b: "str"},47                      false);48    // Tests for additionalProperties together with patternProperties at the top level.49    assertSchemaMatch(coll,50                      {51                        properties: {_id: {}, a: {}},52                        patternProperties: {"^b": {type: "string"}},53                        additionalProperties: {type: "number"}54                      },55                      {_id: 1},56                      true);57    assertSchemaMatch(coll,58                      {59                        properties: {_id: {}, a: {}},60                        patternProperties: {"^b": {type: "string"}},61                        additionalProperties: {type: "number"}62                      },63                      {_id: 1, a: 1},64                      true);65    assertSchemaMatch(coll,66                      {67                        properties: {_id: {}, a: {}},68                        patternProperties: {"^b": {type: "string"}},69                        additionalProperties: {type: "number"}70                      },71                      {_id: 1, a: 1, ba: "str"},72                      true);73    assertSchemaMatch(coll,74                      {75                        properties: {_id: {}, a: {}},76                        patternProperties: {"^b": {type: "string"}},77                        additionalProperties: {type: "number"}78                      },79                      {_id: 1, a: 1, ba: "str", other: 1},80                      true);81    assertSchemaMatch(coll,82                      {83                        properties: {_id: {}, a: {}},84                        patternProperties: {"^b": {type: "string"}},85                        additionalProperties: {type: "number"}86                      },87                      {_id: 1, a: 1, ba: "str", other: "str"},88                      false);89    assertSchemaMatch(coll,90                      {91                        properties: {_id: {}, a: {}},92                        patternProperties: {"^b": {type: "string"}},93                        additionalProperties: {type: "number"}94                      },95                      {_id: 1, a: 1, ba: 1, other: 1},96                      false);97    assertSchemaMatch(coll,98                      {99                        properties: {_id: {}, a: {}},100                        patternProperties: {"^b": {type: "string"}},101                        additionalProperties: false102                      },103                      {_id: 1, a: 1, ba: "str"},104                      true);105    assertSchemaMatch(coll,106                      {107                        properties: {_id: {}, a: {}},108                        patternProperties: {"^b": {type: "string"}},109                        additionalProperties: false110                      },111                      {_id: 1, a: 1, ba: "str", other: 1},112                      false);113    // Tests for {additionalProperties:false} in a nested schema.114    assertSchemaMatch(115        coll, {properties: {obj: {properties: {a: {}}, additionalProperties: false}}}, {}, true);116    assertSchemaMatch(coll,117                      {properties: {obj: {properties: {a: {}}, additionalProperties: false}}},118                      {obj: 1},119                      true);120    assertSchemaMatch(coll,121                      {properties: {obj: {properties: {a: {}}, additionalProperties: false}}},122                      {obj: {}},123                      true);124    assertSchemaMatch(coll,125                      {properties: {obj: {properties: {a: {}}, additionalProperties: false}}},126                      {obj: {a: 1}},127                      true);128    assertSchemaMatch(coll,129                      {properties: {obj: {properties: {a: {}}, additionalProperties: false}}},130                      {obj: {a: 1, b: 1}},131                      false);132    assertSchemaMatch(coll,133                      {properties: {obj: {properties: {a: {}}, additionalProperties: false}}},134                      {obj: {b: 1}},135                      false);136    // Tests for {additionalProperties:true} in a nested schema.137    assertSchemaMatch(coll,138                      {properties: {obj: {properties: {a: {}}, additionalProperties: true}}},139                      {obj: {}},140                      true);141    assertSchemaMatch(coll,142                      {properties: {obj: {properties: {a: {}}, additionalProperties: true}}},143                      {obj: {a: 1}},144                      true);145    assertSchemaMatch(coll,146                      {properties: {obj: {properties: {a: {}}, additionalProperties: true}}},147                      {obj: {a: 1, b: 1}},148                      true);149    assertSchemaMatch(coll,150                      {properties: {obj: {properties: {a: {}}, additionalProperties: true}}},151                      {obj: {b: 1}},152                      true);153    // Tests for additionalProperties whose value is a nested schema, which is itself contained154    // within a nested schema.155    assertSchemaMatch(156        coll,157        {properties: {obj: {properties: {a: {}}, additionalProperties: {type: "number"}}}},158        {},159        true);160    assertSchemaMatch(161        coll,162        {properties: {obj: {properties: {a: {}}, additionalProperties: {type: "number"}}}},163        {obj: 1},164        true);165    assertSchemaMatch(166        coll,167        {properties: {obj: {properties: {a: {}}, additionalProperties: {type: "number"}}}},168        {obj: {}},169        true);170    assertSchemaMatch(171        coll,172        {properties: {obj: {properties: {a: {}}, additionalProperties: {type: "number"}}}},173        {obj: {a: 1}},174        true);175    assertSchemaMatch(176        coll,177        {properties: {obj: {properties: {a: {}}, additionalProperties: {type: "number"}}}},178        {obj: {a: 1, b: 1}},179        true);180    assertSchemaMatch(181        coll,182        {properties: {obj: {properties: {a: {}}, additionalProperties: {type: "number"}}}},183        {obj: {a: 1, b: "str"}},184        false);185    assertSchemaMatch(186        coll,187        {properties: {obj: {properties: {a: {}}, additionalProperties: {type: "number"}}}},188        {obj: {b: "str"}},189        false);190    // Tests for additionalProperties together with patternProperties, both inside a nested schema.191    assertSchemaMatch(coll,192                      {193                        properties: {194                            obj: {195                                properties: {a: {}},196                                patternProperties: {"^b": {type: "string"}},197                                additionalProperties: {type: "number"}198                            }199                        }200                      },201                      {obj: {}},202                      true);203    assertSchemaMatch(coll,204                      {205                        properties: {206                            obj: {207                                properties: {a: {}},208                                patternProperties: {"^b": {type: "string"}},209                                additionalProperties: {type: "number"}210                            }211                        }212                      },213                      {obj: {a: 1, ba: "str", c: 1}},214                      true);215    assertSchemaMatch(coll,216                      {217                        properties: {218                            obj: {219                                properties: {a: {}},220                                patternProperties: {"^b": {type: "string"}},221                                additionalProperties: {type: "number"}222                            }223                        }224                      },225                      {obj: {a: 1, ba: 1, c: 1}},226                      false);227    assertSchemaMatch(coll,228                      {229                        properties: {230                            obj: {231                                properties: {a: {}},232                                patternProperties: {"^b": {type: "string"}},233                                additionalProperties: {type: "number"}234                            }235                        }236                      },237                      {obj: {a: 1, ba: 1, c: "str"}},238                      false);...ObjectMakr-0.2.2.js
Source:ObjectMakr-0.2.2.js  
1var ObjectMakr;2(function (ObjectMakr_1) {3    "use strict";4    /**5     * An factory for JavaScript classes that automates the process of6     * setting constructors' prototypal inheritance. A sketch of class inheritance7     * and a listing of properties for each class is taken in, and dynamically8     * accessible constructors keyed by String names are made available.9     */10    var ObjectMakr = (function () {11        /**12         * Initializes a new instance of the ObjectMakr class.13         *14         * @param settings   Settings to be used for initialization.15         */16        function ObjectMakr(settings) {17            if (typeof settings === "undefined") {18                throw new Error("No settings object given to ObjectMakr.");19            }20            if (typeof settings.inheritance === "undefined") {21                throw new Error("No inheritance given to ObjectMakr.");22            }23            this.inheritance = settings.inheritance;24            this.properties = settings.properties || {};25            this.doPropertiesFull = settings.doPropertiesFull;26            this.indexMap = settings.indexMap;27            this.onMake = settings.onMake;28            this.functions = {};29            if (this.doPropertiesFull) {30                this.propertiesFull = {};31            }32            if (this.indexMap) {33                this.processProperties(this.properties);34            }35            this.processFunctions(this.inheritance, Object, "Object");36        }37        /* Simple gets38        */39        /**40         * @returns The complete inheritance mapping.41         */42        ObjectMakr.prototype.getInheritance = function () {43            return this.inheritance;44        };45        /**46         * @returns The complete properties mapping.47         */48        ObjectMakr.prototype.getProperties = function () {49            return this.properties;50        };51        /**52         * @returns The properties for a particular class.53         */54        ObjectMakr.prototype.getPropertiesOf = function (title) {55            return this.properties[title];56        };57        /**58         * @returns Full properties, if doPropertiesFull is true.59         */60        ObjectMakr.prototype.getFullProperties = function () {61            return this.propertiesFull;62        };63        /**64         * @returns Full properties for a particular class, if65         *          doPropertiesFull is true.66         */67        ObjectMakr.prototype.getFullPropertiesOf = function (title) {68            return this.doPropertiesFull ? this.propertiesFull[title] : undefined;69        };70        /**71         * @returns The full mapping of class constructors.72         */73        ObjectMakr.prototype.getFunctions = function () {74            return this.functions;75        };76        /**77         * @param name   The name of a class to retrieve.78         * @returns The constructor for the given class.79         */80        ObjectMakr.prototype.getFunction = function (name) {81            return this.functions[name];82        };83        /**84         * @param type   The name of a class to check for.85         * @returns Whether that class exists.86         */87        ObjectMakr.prototype.hasFunction = function (name) {88            return this.functions.hasOwnProperty(name);89        };90        /**91         * @returns The optional mapping of indices.92         */93        ObjectMakr.prototype.getIndexMap = function () {94            return this.indexMap;95        };96        /* Core usage97        */98        /**99         * Creates a new instance of the specified type and returns it.100         * If desired, any settings are applied to it (deep copy using proliferate).101         *102         * @param name   The name of the type to initialize a new instance of.103         * @param [settings]   Additional attributes to add to the new instance.104         * @returns A newly created instance of the specified type.105         */106        ObjectMakr.prototype.make = function (name, settings) {107            var output;108            // Make sure the type actually exists in Functions109            if (!this.functions.hasOwnProperty(name)) {110                throw new Error("Unknown type given to ObjectMakr: " + name);111            }112            // Create the new object, copying any given settings113            output = new this.functions[name]();114            if (settings) {115                this.proliferate(output, settings);116            }117            // onMake triggers are handled respecting doPropertiesFull.118            if (this.onMake && output[this.onMake]) {119                output[this.onMake](output, name, settings, (this.doPropertiesFull ? this.propertiesFull : this.properties)[name]);120            }121            return output;122        };123        /* Core parsing124        */125        /**126         * Parser that calls processPropertyArray on all properties given as arrays127         *128         * @param properties   Type properties for classes to create.129         * @remarks Only call this if indexMap is given as an array130         */131        ObjectMakr.prototype.processProperties = function (properties) {132            var name;133            // For each of the given properties:134            for (name in properties) {135                if (properties.hasOwnProperty(name)) {136                    // If it's an Array, replace it with a mapped version137                    if (properties[name] instanceof Array) {138                        properties[name] = this.processPropertyArray(properties[name]);139                    }140                }141            }142        };143        /**144         * Creates an output properties object with the mapping shown in indexMap145         *146         * @param properties   An Array with indiced versions of properties147         * @example148         *     this.indexMap = ["width", "height"];149         *     this.processPropertyArray([7, 14]);150         *     // { "width": 7, "height": 14 }151         */152        ObjectMakr.prototype.processPropertyArray = function (properties) {153            var output = {}, i;154            // For each [i] in properties, set that property as under indexMap[i]155            for (i = properties.length - 1; i >= 0; --i) {156                output[this.indexMap[i]] = properties[i];157            }158            return output;159        };160        /**161         * Recursive parser to generate each Function, starting from the base.162         *163         * @param base   An object whose keys are the names of Functions to164         *               made, and whose values are objects whose keys are165         *               for children that inherit from these Functions166         * @param parent   The parent class Function of the classes about to be made.167         * @param [parentName]   The name of the parent class to be inherited from,168         *                       if it is a generated one (and not Object itself).169         */170        ObjectMakr.prototype.processFunctions = function (base, parent, parentName) {171            var name, ref;172            // For each name in the current object:173            for (name in base) {174                if (base.hasOwnProperty(name)) {175                    this.functions[name] = (new Function());176                    // This sets the Function as inheriting from the parent177                    this.functions[name].prototype = new parent();178                    this.functions[name].prototype.constructor = this.functions[name];179                    // Add each property from properties to the Function prototype180                    for (ref in this.properties[name]) {181                        if (this.properties[name].hasOwnProperty(ref)) {182                            this.functions[name].prototype[ref] = this.properties[name][ref];183                        }184                    }185                    // If the entire property tree is being mapped, copy everything186                    // from both this and its parent to its equivalent187                    if (this.doPropertiesFull) {188                        this.propertiesFull[name] = {};189                        if (parentName) {190                            for (ref in this.propertiesFull[parentName]) {191                                if (this.propertiesFull[parentName].hasOwnProperty(ref)) {192                                    this.propertiesFull[name][ref] = this.propertiesFull[parentName][ref];193                                }194                            }195                        }196                        for (ref in this.properties[name]) {197                            if (this.properties[name].hasOwnProperty(ref)) {198                                this.propertiesFull[name][ref] = this.properties[name][ref];199                            }200                        }201                    }202                    this.processFunctions(base[name], this.functions[name], name);203                }204            }205        };206        /* Utilities207        */208        /**209         * Proliferates all members of the donor to the recipient recursively, as210         * a deep copy.211         *212         * @param recipient   An object receiving the donor's members.213         * @param donor   An object whose members are copied to recipient.214         * @param [noOverride]   If recipient properties may be overriden (by default, false).215         */216        ObjectMakr.prototype.proliferate = function (recipient, donor, noOverride) {217            var setting, i;218            // For each attribute of the donor:219            for (i in donor) {220                // If noOverride is specified, don't override if it already exists221                if (noOverride && recipient.hasOwnProperty(i)) {222                    continue;223                }224                // If it's an object, recurse on a new version of it225                setting = donor[i];226                if (typeof setting === "object") {227                    if (!recipient.hasOwnProperty(i)) {228                        recipient[i] = new setting.constructor();229                    }230                    this.proliferate(recipient[i], setting, noOverride);231                }232                else {233                    // Regular primitives are easy to copy otherwise234                    recipient[i] = setting;235                }236            }237            return recipient;238        };239        return ObjectMakr;240    })();241    ObjectMakr_1.ObjectMakr = ObjectMakr;...AndroidProject.js
Source:AndroidProject.js  
1/**2    Licensed to the Apache Software Foundation (ASF) under one3    or more contributor license agreements.  See the NOTICE file4    distributed with this work for additional information5    regarding copyright ownership.  The ASF licenses this file6    to you under the Apache License, Version 2.0 (the7    "License"); you may not use this file except in compliance8    with the License.  You may obtain a copy of the License at9    http://www.apache.org/licenses/LICENSE-2.010    Unless required by applicable law or agreed to in writing,11    software distributed under the License is distributed on an12    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY13    KIND, either express or implied.  See the License for the14    specific language governing permissions and limitations15    under the License.16*/17var fs = require('fs');18var path = require('path');19var properties_parser = require('properties-parser');20var AndroidManifest = require('./AndroidManifest');21var projectFileCache = {};22function addToPropertyList(projectProperties, key, value) {23    var i = 1;24    while (projectProperties.get(key + '.' + i))25        i++;26    projectProperties.set(key + '.' + i, value);27    projectProperties.dirty = true;28}29function removeFromPropertyList(projectProperties, key, value) {30    var i = 1;31    var currentValue;32    while ((currentValue = projectProperties.get(key + '.' + i))) {33        if (currentValue === value) {34            while ((currentValue = projectProperties.get(key + '.' + (i + 1)))) {35                projectProperties.set(key + '.' + i, currentValue);36                i++;37            }38            projectProperties.set(key + '.' + i);39            break;40        }41        i++;42    }43    projectProperties.dirty = true;44}45function getRelativeLibraryPath (parentDir, subDir) {46    var libraryPath = path.relative(parentDir, subDir);47    return (path.sep == '\\') ? libraryPath.replace(/\\/g, '/') : libraryPath;48}49function AndroidProject(projectDir) {50    this._propertiesEditors = {};51    this._subProjectDirs = {};52    this._dirty = false;53    this.projectDir = projectDir;54    this.platformWww = path.join(this.projectDir, 'platform_www');55    this.www = path.join(this.projectDir, 'assets/www');56}57AndroidProject.getProjectFile = function (projectDir) {58    if (!projectFileCache[projectDir]) {59        projectFileCache[projectDir] = new AndroidProject(projectDir);60    }61    return projectFileCache[projectDir];62};63AndroidProject.purgeCache = function (projectDir) {64    if (projectDir) {65        delete projectFileCache[projectDir];66    } else {67        projectFileCache = {};68    }69};70/**71 * Reads the package name out of the Android Manifest file72 *73 * @param   {String}  projectDir  The absolute path to the directory containing the project74 *75 * @return  {String}              The name of the package76 */77AndroidProject.prototype.getPackageName = function() {78    return new AndroidManifest(path.join(this.projectDir, 'AndroidManifest.xml')).getPackageId();79};80AndroidProject.prototype.getCustomSubprojectRelativeDir = function(plugin_id, src) {81    // All custom subprojects are prefixed with the last portion of the package id.82    // This is to avoid collisions when opening multiple projects in Eclipse that have subprojects with the same name.83    var packageName = this.getPackageName();84    var lastDotIndex = packageName.lastIndexOf('.');85    var prefix = packageName.substring(lastDotIndex + 1);86    var subRelativeDir = path.join(plugin_id, prefix + '-' + path.basename(src));87    return subRelativeDir;88};89AndroidProject.prototype.addSubProject = function(parentDir, subDir) {90    var parentProjectFile = path.resolve(parentDir, 'project.properties');91    var subProjectFile = path.resolve(subDir, 'project.properties');92    var parentProperties = this._getPropertiesFile(parentProjectFile);93    // TODO: Setting the target needs to happen only for pre-3.7.0 projects94    if (fs.existsSync(subProjectFile)) {95        var subProperties = this._getPropertiesFile(subProjectFile);96        subProperties.set('target', parentProperties.get('target'));97        subProperties.dirty = true;98        this._subProjectDirs[subDir] = true;99    }100    addToPropertyList(parentProperties, 'android.library.reference', getRelativeLibraryPath(parentDir, subDir));101    this._dirty = true;102};103AndroidProject.prototype.removeSubProject = function(parentDir, subDir) {104    var parentProjectFile = path.resolve(parentDir, 'project.properties');105    var parentProperties = this._getPropertiesFile(parentProjectFile);106    removeFromPropertyList(parentProperties, 'android.library.reference', getRelativeLibraryPath(parentDir, subDir));107    delete this._subProjectDirs[subDir];108    this._dirty = true;109};110AndroidProject.prototype.addGradleReference = function(parentDir, subDir) {111    var parentProjectFile = path.resolve(parentDir, 'project.properties');112    var parentProperties = this._getPropertiesFile(parentProjectFile);113    addToPropertyList(parentProperties, 'cordova.gradle.include', getRelativeLibraryPath(parentDir, subDir));114    this._dirty = true;115};116AndroidProject.prototype.removeGradleReference = function(parentDir, subDir) {117    var parentProjectFile = path.resolve(parentDir, 'project.properties');118    var parentProperties = this._getPropertiesFile(parentProjectFile);119    removeFromPropertyList(parentProperties, 'cordova.gradle.include', getRelativeLibraryPath(parentDir, subDir));120    this._dirty = true;121};122AndroidProject.prototype.addSystemLibrary = function(parentDir, value) {123    var parentProjectFile = path.resolve(parentDir, 'project.properties');124    var parentProperties = this._getPropertiesFile(parentProjectFile);125    addToPropertyList(parentProperties, 'cordova.system.library', value);126    this._dirty = true;127};128AndroidProject.prototype.removeSystemLibrary = function(parentDir, value) {129    var parentProjectFile = path.resolve(parentDir, 'project.properties');130    var parentProperties = this._getPropertiesFile(parentProjectFile);131    removeFromPropertyList(parentProperties, 'cordova.system.library', value);132    this._dirty = true;133};134AndroidProject.prototype.write = function() {135    if (!this._dirty) {136        return;137    }138    this._dirty = false;139    for (var filename in this._propertiesEditors) {140        var editor = this._propertiesEditors[filename];141        if (editor.dirty) {142            fs.writeFileSync(filename, editor.toString());143            editor.dirty = false;144        }145    }146};147AndroidProject.prototype._getPropertiesFile = function (filename) {148    if (!this._propertiesEditors[filename]) {149        if (fs.existsSync(filename)) {150            this._propertiesEditors[filename] = properties_parser.createEditor(filename);151        } else {152            this._propertiesEditors[filename] = properties_parser.createEditor();153        }154    }155    return this._propertiesEditors[filename];156};...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
