Current File : /home/jvzmxxx/wiki/extensions/Wikibase/view/tests/qunit/jquery/wikibase/snakview/snakview.tests.js
/**
 * @license GPL-2.0+
 * @author H. Snater < mediawiki@snater.com >
 */
( function( $, QUnit, wb, dt, mw ) {
'use strict';

QUnit.module( 'jquery.wikibase.snakview', QUnit.newMwEnvironment( {
	teardown: function() {
		$( '.test_snakview' ).each( function() {
			var $snakview = $( this ),
				snakview = $snakview.data( 'snakview' );

			if ( snakview ) {
				snakview.destroy();
			}

			$snakview.remove();
		} );
	}
} ) );

var snakSerializer = new wb.serialization.SnakSerializer(),
	snakDeserializer = new wb.serialization.SnakDeserializer();

/**
 * @param {Object} [options={}]
 * @param {jQuery} [$node]
 * @return {jQuery}
 */
var createSnakview = function( options, $node ) {
	options = $.extend( {
		autoStartEditing: false,
		entityIdHtmlFormatter: {
			format: function() {
				return $.Deferred().resolve( 'Label' ).promise();
			}
		},
		entityIdPlainFormatter: {
			format: function( entityId ) {
				return $.Deferred().resolve( entityId ).promise();
			}
		},
		entityStore: {
			get: function( entityId ) {
				return $.Deferred().resolve().promise();
			}
		},
		valueViewBuilder: 'I am a ValueViewBuilder',
		dataTypeStore: new dt.DataTypeStore()
	}, options || {} );

	$node = $node || $( '<div/>' ).appendTo( 'body' );

	return $node
		.addClass( 'test_snakview' )
		.snakview( options );
};

QUnit.test( 'Create & destroy', function( assert ) {
	assert.expect( 6 );
	var $snakview = createSnakview(),
		snakview = $snakview.data( 'snakview' );

	assert.ok(
		snakview instanceof $.wikibase.snakview,
		'Created widget.'
	);

	snakview.destroy();

	assert.ok(
		$snakview.data( 'snakview' ) === undefined,
		'Destroyed widget.'
	);

	$snakview = createSnakview( {
		value: new wb.datamodel.PropertyNoValueSnak( 'P1' )
	} );
	snakview = $snakview.data( 'snakview' );

	assert.ok(
		snakview !== undefined,
		'Created widget passing a wikibase.datamodel.Snak object.'
	);

	snakview.destroy();

	assert.ok(
		$snakview.data( 'snakview' ) === undefined,
		'Destroyed widget.'
	);

	$snakview = createSnakview( {
		value: snakSerializer.serialize( new wb.datamodel.PropertyNoValueSnak( 'P1' ) )
	} );
	snakview = $snakview.data( 'snakview' );

	assert.ok(
		snakview !== undefined,
		'Created widget passing a Snak serialization.'
	);

	snakview.destroy();

	assert.ok(
		$snakview.data( 'snakview' ) === undefined,
		'Destroyed widget.'
	);
} );

QUnit.test( 'value()', function( assert ) {
	assert.expect( 7 );
	var $snakview = createSnakview(),
		snakview = $snakview.data( 'snakview' );

	assert.deepEqual(
		snakview.value(),
		{
			snaktype: wb.datamodel.PropertyValueSnak.TYPE
		},
		'Verified default value.'
	);

	var newValue = {
		property: 'P1',
		snaktype: wb.datamodel.PropertySomeValueSnak.TYPE
	};

	snakview.value( newValue );

	assert.deepEqual(
		snakview.value(),
		newValue,
		'Set Snak serialization value.'
	);

	assert.ok(
		snakview.snak().equals( snakDeserializer.deserialize( newValue ) ),
		'Verified Snak object returned by snak().'
	);

	newValue = new wb.datamodel.PropertyNoValueSnak( 'P1' );

	snakview.value( newValue );

	assert.deepEqual(
		snakview.value(),
		snakSerializer.serialize( newValue ),
		'Set wikibase.datamodel.Snak value.'
	);

	assert.ok(
		snakview.snak().equals( newValue ),
		'Verified Snak object returned by snak().'
	);

	newValue = {
		snaktype: wb.datamodel.PropertyValueSnak.TYPE
	};

	snakview.value( newValue );

	assert.deepEqual(
		snakview.value(),
		newValue,
		'Set incomplete Snak serialization value.'
	);

	assert.strictEqual(
		snakview.snak(),
		null,
		'Verified snak() returning "null".'
	);
} );

QUnit.test( 'snak()', function( assert ) {
	assert.expect( 5 );
	var $snakview = createSnakview(),
		snakview = $snakview.data( 'snakview' );

	assert.strictEqual(
		snakview.snak(),
		null,
		'Returning "null" since default value is an incomplete serialization.'
	);

	var snak = new wb.datamodel.PropertySomeValueSnak( 'P1' );

	snakview.snak( snak );

	assert.ok(
		snakview.snak().equals( snak ),
		'Set Snak value.'
	);

	assert.deepEqual(
		snakview.value(),
		snakSerializer.serialize( snak ),
		'Verified serialization returned by value().'
	);

	snakview.snak( null );

	assert.strictEqual(
		snakview.snak(),
		null,
		'Reset value by passing "null" to snak().'
	);

	assert.deepEqual(
		snakview.value(),
		{},
		'Verified serialization returned by value().'
	);
} );

QUnit.test( 'propertyId()', function( assert ) {
	assert.expect( 5 );
	var $snakview = createSnakview(),
		snakview = $snakview.data( 'snakview' );

	assert.strictEqual(
		snakview.propertyId(),
		null,
		'By default, the Property ID is "null".'
	);

	snakview.propertyId( 'P1' );

	assert.equal(
		snakview.propertyId(),
		'P1',
		'Set Property ID.'
	);

	snakview.propertyId( null );

	assert.strictEqual(
		snakview.propertyId(),
		null,
		'Reset Property ID.'
	);

	snakview.snak( new wb.datamodel.PropertyNoValueSnak( 'P1' ) );

	assert.equal(
		snakview.propertyId(),
		'P1',
		'Property ID is updated when setting a Snak.'
	);

	snakview.propertyId( 'P2' );

	assert.ok(
		snakview.snak().equals( new wb.datamodel.PropertyNoValueSnak( 'P2' ) ),
		'Updated Property ID of Snak.'
	);
} );

QUnit.test( 'snakType()', function( assert ) {
	assert.expect( 5 );
	var $snakview = createSnakview(),
		snakview = $snakview.data( 'snakview' );

	assert.strictEqual(
		snakview.snakType(),
		'value',
		'By default, the Snak type is "value".'
	);

	snakview.snakType( 'novalue' );

	assert.equal(
		snakview.snakType(),
		'novalue',
		'Set Snak type.'
	);

	snakview.snakType( null );

	assert.strictEqual(
		snakview.snakType(),
		null,
		'Reset Snak type.'
	);

	snakview.snak( new wb.datamodel.PropertySomeValueSnak( 'P1' ) );

	assert.equal(
		snakview.snakType(),
		'somevalue',
		'Snak type is updated when setting a Snak.'
	);

	snakview.snakType( 'novalue' );

	assert.ok(
		snakview.snak().equals( new wb.datamodel.PropertyNoValueSnak( 'P1' ) ),
		'Updated Snak type of Snak.'
	);
} );

QUnit.test( 'isInitialValue()', function( assert ) {
	assert.expect( 7 );
	var $snakview = createSnakview(),
		snakview = $snakview.data( 'snakview' );

	assert.ok(
		snakview.isInitialValue(),
		'Verified returning TRUE after default initialization.'
	);

	// Simulate change of value by overwriting output of value():
	snakview.value = function() {
		return $.extend( this.options.value, {
			snaktype: 'novalue'
		} );
	};

	assert.ok(
		snakview.isInitialValue(),
		'No proper Snak currently and on initialization is regarded FALSE.'
	);

	snakview.value = function() {
		return snakSerializer.serialize( new wb.datamodel.PropertyNoValueSnak( 'P1' ) );
	};

	assert.ok(
		!snakview.isInitialValue(),
		'Returning FALSE after setting a proper Snak.'
	);

	$snakview = createSnakview( {
		value: new wb.datamodel.PropertyNoValueSnak( 'P1' )
	} );
	snakview = $snakview.data( 'snakview' );

	assert.ok(
		snakview.isInitialValue(),
		'Verified returning TRUE after initialization with a proper Snak object.'
	);

	snakview.value = function() {
		var value = this.options.value;
		delete value.propertyId;
		return value;
	};

	assert.ok(
		!snakview.isInitialValue(),
		'Returning FALSE after breaking serialization.'
	);

	snakview.value = function() {
		return snakSerializer.serialize( new wb.datamodel.PropertySomeValueSnak( 'P1' ) );
	};

	assert.ok(
		!snakview.isInitialValue(),
		'Returning FALSE after setting another Snak.'
	);

	snakview.value = function() {
		return snakSerializer.serialize( new wb.datamodel.PropertyNoValueSnak( 'P1' ) );
	};

	assert.ok(
		snakview.isInitialValue(),
		'Returning TRUE after resetting to initial Snak.'
	);
} );

}( jQuery, QUnit, wikibase, dataTypes, mediaWiki ) );