QUnit.module( 'ext.echo.dm - PaginationModel' );

QUnit.test.each( 'Constructing the model', {
	'Empty config': {
		config: {},
		expected: {}
	},
	'Overriding defaults': {
		config: {
			pageNext: 'continueValNext|123',
			itemsPerPage: 10
		},
		expected: {
			getNextPageContinue: 'continueValNext|123',
			hasNextPage: true,
			getItemsPerPage: 10,
			getCurrentPageItemCount: 10
		}
	}
}, ( assert, data ) => {
	const defaultValues = {
		getPageContinue: undefined,
		getCurrPageIndex: 0,
		getPrevPageContinue: '',
		getCurrPageContinue: '',
		getNextPageContinue: '',
		hasPrevPage: false,
		hasNextPage: false,
		getCurrentPageItemCount: 25,
		getItemsPerPage: 25
	};
	const expected = $.extend( true, {}, defaultValues, data.expected );

	const model = new mw.echo.dm.PaginationModel( data.config );

	for ( const method in expected ) {
		assert.deepEqual(
			// Run the method
			model[ method ](),
			// Expected value
			expected[ method ],
			// Message
			method
		);
	}
} );

QUnit.test( 'Emitting update event', ( assert ) => {
	const results = [];
	const model = new mw.echo.dm.PaginationModel();

	// Listen to update event
	model.on( 'update', () => {
		results.push( [
			model.getCurrPageIndex(),
			model.hasNextPage()
		] );
	} );

	// Trigger events

	// Set up initial pages (first page is 0)
	model.setPageContinue( 1, 'page2|2' ); // [ [ 0, true ] ]
	model.setPageContinue( 2, 'page3|3' ); // [ [ 0, true ], [ 0, true ] ]
	model.setPageContinue( 3, 'page4|4' ); // [ [ 0, true ], [ 0, true ], [ 0, true ] ]

	model.forwards(); // [ [ 0, true ], [ 0, true ], [ 0, true ], [ 1, true ] ]
	model.forwards(); // [ [ 0, true ], [ 0, true ], [ 0, true ], [ 1, true ], [ 2, true ] ]
	model.forwards(); // [ [ 0, true ], [ 0, true ], [ 0, true ], [ 1, true ], [ 2, true ], [ 3, false ] ]
	model.backwards(); // [ [ 0, true ], [ 0, true ], [ 0, true ], [ 1, true ], [ 2, true ], [ 3, false ], [ 2, true ] ]
	model.setCurrentPageItemCount(); // [ [ 0, true ], [ 0, true ], [ 0, true ], [ 1, true ], [ 2, true ], [ 3, false ], [ 2, true ], [ 2, true ] ]
	model.reset(); // [ [ 0, true ], [ 0, true ], [ 0, true ], [ 1, true ], [ 2, true ], [ 3, false ], [ 2, true ], [ 2, true ], [ 0, false ] ]

	assert.deepEqual(
		// Actual
		results,
		// Expected:
		[ [ 0, true ], [ 0, true ], [ 0, true ], [ 1, true ], [ 2, true ], [ 3, false ], [ 2, true ], [ 2, true ], [ 0, false ] ],
		// Message
		'Update events emitted'
	);
} );
