blob: 2859e5f09cbe6ba5e83990f010b4fcd80de2b68c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
namespace Apache.Ignite.Core.Tests.Examples
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Apache.Ignite.Examples.Compute;
using NUnit.Framework;
/// <summary>
/// Represents an Example to be tested.
/// </summary>
public class Example
{
/** Execute action */
private Action _runAction;
/** Config url */
public string ConfigPath { get; private set; }
/** Dll load flag */
public bool NeedsTestDll { get; private set; }
/** Name */
public Type ExampleType { get; private set; }
/// <summary>
/// Runs this example.
/// </summary>
public void Run()
{
try
{
_runAction();
}
catch (InvalidOperationException ex)
{
// Each example has a ReadKey at the end, which throws an exception in test environment.
if (ex.Message != "Cannot read keys when either application does not have a console or " +
"when console input has been redirected from a file. Try Console.Read.")
{
throw;
}
return;
}
throw new Exception("ReadKey missing at the end of the example.");
}
/// <summary>
/// Gets all examples.
/// </summary>
public static IEnumerable<Example> GetExamples()
{
var examplesAsm = typeof (ClosureExample).Assembly;
var sourceFiles = Directory.GetFiles(PathUtil.ExamplesSourcePath, "*.cs", SearchOption.AllDirectories)
.Where(x => !x.Contains("dotnetcore")).ToArray();
Assert.IsTrue(sourceFiles.Any());
var types = examplesAsm.GetTypes().Where(x => x.GetMethod("Main") != null).OrderBy(x => x.Name).ToArray();
Assert.IsTrue(types.Any());
foreach (var type in types)
{
var sourceFile = sourceFiles.Single(
x => x.EndsWith(string.Format("{0}{1}.cs", Path.DirectorySeparatorChar, type.Name)));
var sourceCode = File.ReadAllText(sourceFile);
yield return new Example
{
ConfigPath = GetConfigPath(sourceCode),
NeedsTestDll = sourceCode.Contains("-assembly="),
_runAction = GetRunAction(type),
ExampleType = type
};
}
}
/// <summary>
/// Gets the run action.
/// </summary>
private static Action GetRunAction(Type type)
{
var mainMethod = type.GetMethod("Main");
Assert.IsNotNull(mainMethod);
return (Action) Delegate.CreateDelegate(typeof (Action), mainMethod);
}
/// <summary>
/// Gets the spring configuration URL.
/// </summary>
private static string GetConfigPath(string code)
{
var match = Regex.Match(code, "-configFileName=(.*?.config)");
return match.Success ? match.Groups[1].Value : null;
}
/** <inheritdoc /> */
public override string ToString()
{
// This will be displayed in TeamCity and R# test runner
return ExampleType.Name;
}
}
}