Index: tests/admin/includesNavMenu.php
===================================================================
--- tests/admin/includesNavMenu.php	(Revision 0)
+++ tests/admin/includesNavMenu.php	(Arbeitskopie)
@@ -0,0 +1,163 @@
+<?php
+
+require_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );
+
+/**
+ * @group admin
+ */
+class Tests_Admin_NavMenus extends WP_UnitTestCase
+{
+
+	private $menu_items_sorted_by_position;
+	private $user_id;
+
+	function setUp()
+	{
+		parent::setUp();
+
+		$this->user_id = $this->factory->user->create( array( 'role' => 'author' ) );
+
+		$this->menu_items_sorted_by_position = array();
+		$item = $this->create_menu_item_for_test( $this->user_id, "A", 1, 0 );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+		$item = $this->create_menu_item_for_test( $this->user_id, "B", 2, $item->db_id );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+		$parent_id = $item->db_id;
+		$item = $this->create_menu_item_for_test( $this->user_id, "C", 3, $parent_id );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+		$item = $this->create_menu_item_for_test( $this->user_id, "D", 4, $parent_id );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+		$item = $this->create_menu_item_for_test( $this->user_id, "E", 5, 0 );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+		$item = $this->create_menu_item_for_test( $this->user_id, "F", 6, $item->db_id );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+		$item = $this->create_menu_item_for_test( $this->user_id, "G", 7, $item->db_id );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+		$item = $this->create_menu_item_for_test( $this->user_id, "H", 8, 0 );
+		$this->menu_items_sorted_by_position[ $item->menu_order ] = $item;
+	}
+
+	function test_wp_update_menu_item_positions_nothing_changed()
+	{
+		$unchangedMenuItem = array();
+		$changed_menu_items = array();
+		foreach ( $this->menu_items_sorted_by_position as $item ) {
+			$unchangedMenuItem[ $item->db_id ] = $item;
+		}
+		wp_update_menu_item_positions( $this->menu_items_sorted_by_position, $unchangedMenuItem, $changed_menu_items );
+		$this->assert_order( array( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' ) );
+	}
+
+	/**
+	 * test to move menu item E from position 5 to 1. Expected order:
+	 * E, F, G, A, B, C, D, H
+	 */
+	function test_wp_update_menu_item_positions_simple_change()
+	{
+		$unchanged_menu_items = array();
+		$changed_menu_items = array();
+		foreach ( $this->menu_items_sorted_by_position as $item ) {
+			if ( $item->post_title == "E" ) {
+				$changed_menu_items[ 1 ] = $this->update_menu_item( $item, 1 );
+			} else {
+				$unchanged_menu_items[ $item->db_id ] = $item;
+			}
+		}
+		wp_update_menu_item_positions( $this->menu_items_sorted_by_position, $unchanged_menu_items, $changed_menu_items );
+		$this->assert_order( array( 'E', 'F', 'G', 'A', 'B', 'C', 'D', 'H' ) );
+	}
+
+	/**
+	 *
+	 */
+	function test_wp_update_menu_item_positions_complex_change()
+	{
+		$unchanged_menu_items = array();
+		$changed_menu_items = array();
+		foreach ( $this->menu_items_sorted_by_position as $item ) {
+			if ( $item->post_title == "C" ) {
+				$changed_menu_items[ 1 ] = $this->update_menu_item( $item, 1 );
+			} elseif ( $item->post_title == "F" ) {
+				$changed_menu_items[ 2 ] = $this->update_menu_item( $item, 2 );
+			} elseif ( $item->post_title == "A" ) {
+				$changed_menu_items[ 5 ] = $this->update_menu_item( $item, 5 );
+			} elseif ( $item->post_title == "D" ) {
+				$changed_menu_items[ 8 ] = $this->update_menu_item( $item, 8 );
+			} else {
+				$unchanged_menu_items[ $item->db_id ] = $item;
+			}
+		}
+		wp_update_menu_item_positions( $this->menu_items_sorted_by_position, $unchanged_menu_items, $changed_menu_items );
+		$this->assert_order( array( 'C', 'F', 'G', 'E', 'A', 'B', 'H', 'D' ) );
+	}
+
+	function test_wp_update_menu_item_positions_insert_new()
+	{
+		$unchanged_menu_items = array();
+		$changed_menu_items = array();
+		foreach ( $this->menu_items_sorted_by_position as $item ) {
+			if ( $item->post_title == 'A' ) {
+				$new_item = $this->create_menu_item_for_test( $this->user_id, 'A1', 2, $item->db_id );
+				$changed_menu_items[ 2 ] = $this->update_menu_item( $new_item, 2 );
+			} elseif ( $item->post_title == 'B' ) {
+				$new_item = $this->create_menu_item_for_test( $this->user_id, 'B1', 4, $item->db_id );
+				$changed_menu_items[ 4 ] = $this->update_menu_item( $new_item, 4 );
+			} elseif ( $item->post_title == 'D' ) {
+				$new_item = $this->create_menu_item_for_test( $this->user_id, 'D1', 7, $item->db_id );
+				$changed_menu_items[ 7 ] = $this->update_menu_item( $new_item, 7 );
+				$new_item = $this->create_menu_item_for_test( $this->user_id, 'D11', 8, $new_item->db_id );
+				$changed_menu_items[ 8 ] = $this->update_menu_item( $new_item, 8 );
+			} elseif ( $item->post_title == 'G' ) {
+				$new_item = $this->create_menu_item_for_test( $this->user_id, 'G1', 12, $item->db_id );
+				$changed_menu_items[ 12 ] = $this->update_menu_item( $new_item, 12 );
+				$new_item = $this->create_menu_item_for_test( $this->user_id, 'G2', 13, 0 );
+				$changed_menu_items[ 13 ] = $this->update_menu_item( $new_item, 13 );
+			}
+
+			$unchanged_menu_items[ $item->db_id ] = $item;
+		}
+		wp_update_menu_item_positions( $this->menu_items_sorted_by_position, $unchanged_menu_items, $changed_menu_items );
+		$this->assert_order( array( 'A', 'A1', 'B', 'B1', 'C', 'D', 'D1', 'D11', 'E', 'F', 'G', 'G1', 'G2', 'H' ) );
+	}
+
+	public function update_menu_item( $item, $new_position )
+	{
+		$item->menu_order = $new_position;
+		wp_update_post( $item );
+		$changed_menu_item = array(
+			'db_id' => $item->db_id,
+			'menu_order' => $item->menu_order,
+			'menu_item_parent' => $item->menu_item_parent
+		);
+		return (object) $changed_menu_item;
+	}
+
+
+	private function create_menu_item_for_test( $user_id, $title, $menu_order, $menu_item_parent = 0 )
+	{
+		$post = array(
+			'post_author' => $user_id,
+			'post_status' => 'publish',
+			'post_content' => rand_str(),
+			'post_title' => $title,
+			'post_type' => 'nav_menu_item',
+			'menu_order' => $menu_order,
+		);
+
+		$nav_id = wp_insert_post( $post );
+		$post = get_post( $nav_id );
+		$post->db_id = $nav_id;
+		$post->menu_item_parent = $menu_item_parent;
+		return $post;
+	}
+
+	private function assert_order( $new_order )
+	{
+		foreach ( $this->menu_items_sorted_by_position as $item ) {
+			$post = get_post( $item->db_id );
+			$expected_position = array_search( $item->post_title, $new_order ) + 1;
+			$this->assertEquals( $expected_position, $post->menu_order, "Menu order is wrong" );
+		}
+	}
+
+}
