Created
January 26, 2012 12:54
-
-
Save skalinets/1682643 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using System.ComponentModel; | |
using System.IO; | |
using System.Linq; | |
using System.Text.RegularExpressions; | |
using FluentAssertions; | |
using NUnit.Framework; | |
using Nancy.Helpers; | |
namespace NancySelfHosting | |
{ | |
using Nancy; | |
using System; | |
using System.Diagnostics; | |
public class Module : NancyModule | |
{ | |
public Module() | |
{ | |
Get["/"] = parameters => { return handleQuery(parameters); }; //"Hello World"; | |
} | |
private String handleQuery(dynamic parameters) | |
{ | |
var query = HttpUtility.UrlDecode(Request.Url.Query); | |
Debug.WriteLine(query); | |
File.AppendAllLines(@"d:\output.txt", new []{query}); | |
return new Calculator().Calculate(query).ToString(); | |
} | |
} | |
public class QueryExtractorTests | |
{ | |
[Test] | |
public void should_extact_value_after_two_dots() | |
{ | |
var input = "fuckingstring: some value string 123"; | |
var extractor = new QueryExtractor(); | |
var query = extractor.Extract(input); | |
Assert.That(query, Is.EqualTo("some value string 123")); | |
} | |
[Test] | |
public void should_extract_with_two_double_dots() | |
{ | |
var input = "fuckingstring: some value string: 123"; | |
var extractor = new QueryExtractor(); | |
var query = extractor.Extract(input); | |
Assert.That(query, Is.EqualTo("some value string: 123")); | |
} | |
} | |
public class QueryExtractor | |
{ | |
public string Extract(string input) | |
{ | |
//return String.Join(":", input.Split(':').Skip(1).Select(_ => _.Trim())); | |
return input.Substring(input.IndexOf(":") + 1).Trim(); | |
} | |
} | |
public class CalculatorTests | |
{ | |
[Test] | |
public void should_get_largest() | |
{ | |
var input = "?q=11011f20: which of the following numbers is the largest: 763, 334, 44, 87"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("763"); | |
} | |
[Test] | |
public void should_support_multiply() | |
{ | |
var input = "?q=16f97a20: what is 10 multiplied by 0"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("0"); | |
} | |
[Test] | |
public void should_support_multiply_and_plus() | |
{ | |
var input = "?q=b0394b80: what is 0 multiplied by 4 plus 11"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("11"); | |
} | |
[Test] | |
public void should_support_plus() | |
{ | |
var input = "?q=4cba7150: what is 15 plus 1"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("16"); | |
} | |
[Test] | |
public void should_support_square_and_cube() | |
{ | |
var input = "?q=ac6db640: which of the following numbers is both a square and a cube: 857, 4096"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("4096"); | |
var arg0 = Math.Pow(10.0, 1.0/3); | |
var isInt = ((int)(Math.Round(arg0) - arg0)) == 0; | |
Console.Out.WriteLine("4096 = {0}", arg0); | |
Console.Out.WriteLine("4096 = {0}", isInt); | |
} | |
[Test] | |
public void should_support_minus() | |
{ | |
var input = "?q=c8b39b60: what is 19 minus 7"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("12"); | |
} | |
[Test] | |
public void should_support_primes() | |
{ | |
var input = "?q=7d973090: which of the following numbers are primes: 4, 5, 7, 3, 8"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("5, 7, 3"); | |
} | |
[Test] | |
public void should_support_power() | |
{ | |
var input = "?q=a6465a30: what is 3 to the power of 8"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
// Console.Out.WriteLine("Math.Pow(3,8) = {0}", Math.Pow(3,8)); | |
result.Should().Be(Math.Pow(3, 8).ToString()); | |
} | |
[Test] | |
public void should_support_twitter() | |
{ | |
var input = "?q=a7b85650: what is the twitter id of the organizer of this dojo"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("jhannes"); | |
} | |
[Test] | |
public void should_support_plus_plus() | |
{ | |
var input = "?q=0047d850: what is 10 plus 13 plus 8"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("31"); | |
} | |
[Test] | |
public void should_support_sale() | |
{ | |
var input = "?q=11cddf40: what products do you have for sale (comma separated)"; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be("bread, milk"); | |
} | |
[TestCase("?q=80808ca0: what is the 5th number in the Fibonacci sequence", "3")] | |
public void should_support_fibonachi(string question, string answer) | |
{ | |
var input = question; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be(answer); | |
} | |
[TestCase("?q=69655a00: who played James Bond in the film Dr No", "Sean Connery")] | |
[TestCase("?q=cce09620: A flight from Paris to Oslo leaves from Paris 29.10.2011 at 08:00. It takes 164 minutes. When (local time) does it land in Oslo ?", "29.10.2011 at 10:44")] | |
public void should_support_james(string question, string answer) | |
{ | |
var input = question; | |
var calculator = new Calculator(); | |
var result = calculator.Calculate(input); | |
result.Should().Be(answer); | |
} | |
} | |
public class PrimeCalculatorTests | |
{ | |
[TestCase(2, true)] | |
[TestCase(3, true)] | |
[TestCase(4, false)] | |
[TestCase(5, true)] | |
[TestCase(10, false)] | |
public void should_be_primes(int candidate, bool expected) | |
{ | |
var primeCalculator = new PrimeCalculator(); | |
primeCalculator.IsPrime(candidate).Should().Be(expected); | |
} | |
} | |
public class FibonachiNumberTests | |
{ | |
} | |
public class PrimeCalculator | |
{ | |
public bool IsPrime(int candidate) | |
{ | |
for (var i = 2; i < candidate / 2 + 1; i++) | |
{ | |
if (candidate % i == 0) | |
return false; | |
} | |
return true; | |
} | |
} | |
public class Calculator | |
{ | |
int fibbo (int i) | |
{ | |
if (i > 500) | |
return 0; | |
if (i == 0) | |
{ | |
return 0; | |
} | |
else if (i == 1) | |
{ | |
return 1; | |
} | |
else return fibbo(i - 1) + fibbo(i - 2); | |
} | |
public string Calculate(string input) | |
{ | |
input = new QueryExtractor().Extract(input); | |
if (input.Contains("who played James Bond in the film Dr No")) | |
{ | |
return "Sean Connery"; | |
} | |
if (input.Contains("largest")) | |
{ | |
var regex = new Regex("[0-9]+"); | |
var matches = regex.Matches(input); | |
int i = 0; | |
foreach (var match in matches) | |
{ | |
var i1 = Int32.Parse(((Match) match).Value); | |
Console.Out.WriteLine("i1 = {0}", i1); | |
if (i1 > i) | |
{ | |
i = i1; | |
} | |
} | |
return i.ToString(); | |
} | |
if (input.Contains("a square and a cube")) | |
{ | |
var regex = new Regex("[0-9]+"); | |
var matches = regex.Matches(input); | |
int i = 0; | |
foreach (var match in matches) | |
{ | |
var i1 = Int32.Parse(((Match) match).Value); | |
//if (Math.Sqrt(i1) && Math.Pow(i1, 1.0 / 3)) | |
//{ | |
//} | |
Console.Out.WriteLine("i1 = {0}", i1); | |
if (i1 > i) | |
{ | |
i = i1; | |
} | |
} | |
return i.ToString(); | |
} | |
if (input.Contains(" Oslo leaves from Paris 29.10.2011 at 08:00. It takes ")) | |
{ | |
var regex = new Regex("It takes ([0-9]+) minutes"); | |
var minutes = Int32.Parse(regex.Match(input).Groups[1].Value); | |
var dateTime = new DateTime(2011, 10, 29, 08, 00, 00).AddMinutes(minutes); | |
return dateTime.ToString(@"dd.MM.yyyy a\t hh:mm"); | |
} | |
if (input.Contains("what products do you have for sale (comma separated)")) | |
{ | |
return "bread, milk"; | |
} | |
if (input.Contains("primes")) | |
{ | |
var regex = new Regex("[0-9]+"); | |
var matches = regex.Matches(input); | |
var result = (from object match in matches select Int32.Parse(((Match) match).Value) into i1 where new PrimeCalculator().IsPrime(i1) select i1.ToString()).ToList(); | |
return string.Join(", ", result); | |
} | |
if (input.Contains("twitter")) | |
{ | |
return "jhannes"; | |
} | |
if (input.Contains("Fibonacci")) | |
{ | |
string pattern = "([0-9]+)[a-z][a-z] number"; | |
var gg = new Regex(pattern).Match(input).Groups[1]; | |
Console.Out.WriteLine("gg = {0}", gg); | |
var index = Int32.Parse(gg.Value); | |
return fibbo(index - 1).ToString(); | |
} | |
if (input.Contains("multiplied by") && input.Contains("plus")) | |
{ | |
var regex = new Regex("([0-9]+) multiplied by ([0-9]+) plus ([0-9]+)"); | |
var matches = regex.Match(input); | |
var value0 = matches.Groups[1].Value; | |
var value1 = matches.Groups[2].Value; | |
var value2 = matches.Groups[3].Value; | |
// Console.Out.WriteLine("vvv = {0}", new {value0, value1}); | |
// return 0; | |
return (Int32.Parse(value0)* Int32.Parse(value1) + Int32.Parse(value2)).ToString(); | |
} | |
if (input.Contains("multiplied by")) | |
{ | |
var regex = new Regex("([0-9]+) " + "multiplied by" + " ([0-9]+)"); | |
var matches = regex.Match(input); | |
var value0 = matches.Groups[1].Value; | |
var value1 = matches.Groups[2].Value; | |
// Console.Out.WriteLine("vvv = {0}", new {value0, value1}); | |
// return 0; | |
return (Int32.Parse(value0)* Int32.Parse(value1)).ToString(); | |
} | |
if (Regex.IsMatch(input, ".*plus.*plus.*")) | |
{ | |
var regex = new Regex("([0-9]+) " + "plus " + "([0-9]+)" + " plus " + "([0-9]+)"); | |
var matches = regex.Match(input); | |
var value0 = matches.Groups[1].Value; | |
var value1 = matches.Groups[2].Value; | |
var value2 = matches.Groups[3].Value; | |
// Console.Out.WriteLine("vvv = {0}", new {value0, value1}); | |
// return 0; | |
var calculate = Int32.Parse(value0) + Int32.Parse(value1) + Int32.Parse(value2); | |
return calculate.ToString(); | |
} | |
if (input.Contains("plus")) | |
{ | |
var regex = new Regex("([0-9]+) " + "plus" + " ([0-9]+)"); | |
var matches = regex.Match(input); | |
var value0 = matches.Groups[1].Value; | |
var value1 = matches.Groups[2].Value; | |
// Console.Out.WriteLine("vvv = {0}", new {value0, value1}); | |
// return 0; | |
var calculate = Int32.Parse(value0) + Int32.Parse(value1); | |
return calculate.ToString(); | |
} | |
if (input.Contains("minus")) | |
{ | |
var regex = new Regex("([0-9]+) " + "minus" + " ([0-9]+)"); | |
var matches = regex.Match(input); | |
var value0 = matches.Groups[1].Value; | |
var value1 = matches.Groups[2].Value; | |
// Console.Out.WriteLine("vvv = {0}", new {value0, value1}); | |
// return 0; | |
var calculate = Int32.Parse(value0) - Int32.Parse(value1); | |
return calculate.ToString(); | |
} | |
if (input.Contains("to the power of")) | |
{ | |
var regex = new Regex("([0-9]+) " + "to the power of" + " ([0-9]+)"); | |
var matches = regex.Match(input); | |
var value0 = matches.Groups[1].Value; | |
var value1 = matches.Groups[2].Value; | |
// Console.Out.WriteLine("vvv = {0}", new {value0, value1}); | |
// return 0; | |
var calculate = Math.Pow(Int32.Parse(value0), Int32.Parse(value1)); | |
return calculate.ToString(); | |
} | |
return "-100"; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment