Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

First commit #18

Open
wants to merge 4 commits into
base: software-engineer-dotnet
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Algorithms.CountingBits.Tests/PositiveBitCounterTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace Algorithms.CountingBits.Tests
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;


[TestClass]
public class PositiveBitCounterTest
{
Expand Down Expand Up @@ -47,5 +48,7 @@ public void Count_ValidInput_MultipleOcurrence()
actual: this.bitCounter.Count(161).ToList(),
message: "The result is not the expected");
}

}

}
24 changes: 23 additions & 1 deletion Algorithms.CountingBits/PositiveBitCounter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,35 @@
namespace Algorithms.CountingBits
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class PositiveBitCounter
{
public IEnumerable<int> Count(int input)
{
throw new NotImplementedException();
List<int> result = new List<int>();
if ( input >= 0)
{
var str = Convert.ToString(input, 2);
int numberTimesOne = str.Count(x => x == '1');
result.Add(numberTimesOne);
var strReverse = str.Reverse().ToArray();
for ( int i =0; i< strReverse.Count();i++)
{
if (strReverse[i] == '1')
result.Add(i);
if ((numberTimesOne+1) == result.Count())
return result;
}
}
else
{
throw new ArgumentException();
}
return result;
}

}
}
22 changes: 22 additions & 0 deletions README_Candidate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## Payvision Recruitment Challenges - Software Engineer / .NET

## Intro
There are two challenges



## 1- Counting bits

- Done!

## 2- Refactoring fraud detection

- Done! I have created a new test to throw an exception If the input file doesn't exist on Test Project


Cheers





28 changes: 20 additions & 8 deletions Refactoring.FraudDetection.Tests/FraudRadarTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@
// Copyright (c) Payvision. All rights reserved.
// </copyright>

using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;


namespace Refactoring.FraudDetection.Tests
{
[TestClass]
public class FraudRadarTests
{
{
[TestMethod]
[DeploymentItem("./Files/OneLineFile.txt", "Files")]
public void CheckFraud_OneLineFile_NoFraudExpected()
Expand Down Expand Up @@ -50,19 +50,31 @@ public void CheckFraud_ThreeLines_SecondLineFraudulent()

[TestMethod]
[DeploymentItem("./Files/FourLines_MoreThanOneFraudulent.txt", "Files")]

public void CheckFraud_FourLines_MoreThanOneFraudulent()
{
var result = ExecuteTest(Path.Combine(Environment.CurrentDirectory, "Files", "FourLines_MoreThanOneFraudulent.txt"));

result.Should().NotBeNull("The result should not be null.");
result.Should().HaveCount(2, "The result should contains the number of lines of the file");
}

private static List<FraudRadar.FraudResult> ExecuteTest(string filePath)
[TestMethod]
[DeploymentItem("./Files/InputFileDoesntExist.txt", "Files")]

public void InputFileDoentExist_ArgumentExceptionExpected()
{
var fraudRadar = new FraudRadar();
Assert.ThrowsException<FileNotFoundException>(() => ExecuteTest(Path.Combine(Environment.CurrentDirectory, "Files", "InputFileDoesntExist.txt")));
}

private static List<FraudResult> ExecuteTest(string filePath)
{
var normalizeService = new NormalizeService();
var orderService = new OrderService(normalizeService, filePath);
var checkService = new CheckFraudSevice();
var orders = orderService.LoadOdersFromFile(filePath);
var fraudRadar = new FraudRadar(checkService);

return fraudRadar.Check(filePath).ToList();
return fraudRadar.Check(orders).ToList();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="5.7.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
<PackageReference Include="Moq" Version="4.14.5" />
<PackageReference Include="MSTest.TestAdapter" Version="1.4.0" />
<PackageReference Include="MSTest.TestFramework" Version="1.4.0" />
</ItemGroup>
Expand Down
117 changes: 14 additions & 103 deletions Refactoring.FraudDetection/FraudRadar.cs
Original file line number Diff line number Diff line change
@@ -1,122 +1,33 @@
// <copyright file="FraudRadar.cs" company="Payvision">
// Copyright (c) Payvision. All rights reserved.
// </copyright>

using System.Collections.Generic;
namespace Refactoring.FraudDetection
{
using System;
using System.Collections.Generic;
using System.IO;

public class FraudRadar

public class FraudRadar : IFraudRadar
{
public IEnumerable<FraudResult> Check(string filePath)
private readonly ICheckFraudSevice _checkFraudService;

public FraudRadar(ICheckFraudSevice checkFraudService)
{
_checkFraudService = checkFraudService;
}
public IEnumerable<FraudResult> Check(IEnumerable<Order> orders)
{
// READ FRAUD LINES
var orders = new List<Order>();
var fraudResults = new List<FraudResult>();

var lines = File.ReadAllLines(filePath);

foreach (var line in lines)
{
var items = line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

var order = new Order
{
OrderId = int.Parse(items[0]),
DealId = int.Parse(items[1]),
Email = items[2].ToLower(),
Street = items[3].ToLower(),
City = items[4].ToLower(),
State = items[5].ToLower(),
ZipCode = items[6],
CreditCard = items[7]
};

orders.Add(order);
}

// NORMALIZE
var currentOrders = new List<Order>();
foreach (var order in orders)
{
//Normalize email
var aux = order.Email.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries);

var atIndex = aux[0].IndexOf("+", StringComparison.Ordinal);

aux[0] = atIndex < 0 ? aux[0].Replace(".", "") : aux[0].Replace(".", "").Remove(atIndex);

order.Email = string.Join("@", new string[] { aux[0], aux[1] });

//Normalize street
order.Street = order.Street.Replace("st.", "street").Replace("rd.", "road");

//Normalize state
order.State = order.State.Replace("il", "illinois").Replace("ca", "california").Replace("ny", "new york");
}

// CHECK FRAUD
for (int i = 0; i < orders.Count; i++)
{
var current = orders[i];
bool isFraudulent = false;

for (int j = i + 1; j < orders.Count; j++)
{
isFraudulent = false;

if (current.DealId == orders[j].DealId
&& current.Email == orders[j].Email
&& current.CreditCard != orders[j].CreditCard)
{
isFraudulent = true;
}

if (current.DealId == orders[j].DealId
&& current.State == orders[j].State
&& current.ZipCode == orders[j].ZipCode
&& current.Street == orders[j].Street
&& current.City == orders[j].City
&& current.CreditCard != orders[j].CreditCard)
{
isFraudulent = true;
}

if (isFraudulent)
{
fraudResults.Add(new FraudResult { IsFraudulent = true, OrderId = orders[j].OrderId });
}
}
if (_checkFraudService.IsFraudOrder(currentOrders, order))
fraudResults.Add(new FraudResult(order.OrderId, true));
currentOrders.Add(order);
}

return fraudResults;
}

public class FraudResult
{
public int OrderId { get; set; }

public bool IsFraudulent { get; set; }
}

public class Order
{
public int OrderId { get; set; }

public int DealId { get; set; }

public string Email { get; set; }

public string Street { get; set; }

public string City { get; set; }

public string State { get; set; }

public string ZipCode { get; set; }

public string CreditCard { get; set; }
}
}
}
13 changes: 13 additions & 0 deletions Refactoring.FraudDetection/IFraudRadar.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// <copyright file="FraudRadar.cs" company="Payvision">
// Copyright (c) Payvision. All rights reserved.
// </copyright>

using System.Collections.Generic;

namespace Refactoring.FraudDetection
{
public interface IFraudRadar
{
IEnumerable<FraudResult> Check(IEnumerable<Order> orders);
}
}
9 changes: 9 additions & 0 deletions Refactoring.FraudDetection/Interfaces/ICheckFraudSevice.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Collections.Generic;

namespace Refactoring.FraudDetection
{
public interface ICheckFraudSevice
{
bool IsFraudOrder(IEnumerable<Order> currentOrders, Order newOrder);
}
}
9 changes: 9 additions & 0 deletions Refactoring.FraudDetection/Interfaces/INormalizeService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Refactoring.FraudDetection
{
public interface INormalizeService
{
string NormalizeEmail(string email);
string NormalizeStreet(string street);
string NormalizeState(string state);
}
}
20 changes: 20 additions & 0 deletions Refactoring.FraudDetection/Interfaces/IOrder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// <copyright file="FraudRadar.cs" company="Payvision">
// Copyright (c) Payvision. All rights reserved.
// </copyright>

namespace Refactoring.FraudDetection
{
public interface IOrder
{
string City { get; set; }
string CreditCard { get; set; }
int DealId { get; set; }
string Email { get; set; }
int OrderId { get; set; }
string State { get; set; }
string Street { get; set; }
string ZipCode { get; set; }


}
}
9 changes: 9 additions & 0 deletions Refactoring.FraudDetection/Interfaces/IOrderService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Collections.Generic;

namespace Refactoring.FraudDetection
{
public interface IOrderService
{
IEnumerable<Order> LoadOdersFromFile(string filePath);
}
}
20 changes: 20 additions & 0 deletions Refactoring.FraudDetection/Models/FraudResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// <copyright file="FraudRadar.cs" company="Payvision">
// Copyright (c) Payvision. All rights reserved.
// </copyright>

namespace Refactoring.FraudDetection
{

public class FraudResult
{
public int OrderId { get; set; }

public bool IsFraudulent { get; set; }
public FraudResult(int OrderId, bool IsFraudulent)
{
this.OrderId = OrderId;
this.IsFraudulent = IsFraudulent;
}
}

}
Loading