/*
 * Copyright 2005 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
using Nexus.Core.Commands;
using NUnit.Framework;

namespace Nexus.Core
{
	/// <summary>
	/// Exercise IRequestCatalog per [OVR-8].
	/// </summary>
	/// 
	[TestFixture]
	public class CatalogTest : CatalogBaseTest
	{
		/// <summary>
		/// A simple "list all" command should return nominal with an outcome. 
		/// </summary>
		/// 
		[Test]
		public void ExecuteRequest()
		{
			IRequestContext context = catalog.ExecuteRequest(ListAll.LIST_ALL);
			AssertNominal(context);
			Assert.IsTrue(context.IsNominal, "Expected nominal result.");
			Assert.IsTrue(context.HasOutcome, "Expected outcome from command.");
		}

	}
}