1
0

tests: add more test cases for LinkedList

This commit is contained in:
Rokas Puzonas 2022-04-07 01:53:24 +03:00
parent c9eba7336c
commit 636d2b21e5
12 changed files with 875 additions and 136 deletions

View File

@ -1,45 +1,45 @@
----------------------------
| Įtaisai |
----------------------------
| ID | Vardas | Kaina |
| ID | Vardas | Kaina |
----------------------------
| 0 | Atsuktuvas | 0.99 |
| 1 | Varztas | 0.05 |
| 2 | Laidas | 2.00 |
| 3 | Plaktukas | 2.99 |
| 0 | Atsuktuvas | 0.99 |
| 1 | Varztas | 0.05 |
| 2 | Laidas | 2.00 |
| 3 | Plaktukas | 2.99 |
----------------------------
--------------------------------------------------
| Pirkėjai |
--------------------------------------------------
| Pavardė | Vardas | Įtaisas | Įtaiso kiekis |
| Pavardė | Vardas | Įtaisas | Įtaiso kiekis |
--------------------------------------------------
| Petraitis | Petras | 0 | 10 |
| Petraitis | Petras | 1 | 10 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 1 | 20 |
| Onaite | Ona | 2 | 200 |
| Jonaitis | Brolis | 1 | 100 |
| Jonaitis | Brolis | 0 | 100 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 2 | 20 |
| Onaite | Ona | 0 | 20 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 1 | 20 |
| Onaite | Ona | 2 | 200 |
| Jonaitis | Brolis | 1 | 100 |
| Jonaitis | Brolis | 0 | 100 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 1 | 20 |
| Jonaitis | Jonas | 2 | 20 |
| Onaite | Ona | 0 | 20 |
--------------------------------------------------
------------------------------------------------------------
| Populiariausi įtaisai |
------------------------------------------------------------
| ID | Vardas | Įtaisų kiekis, vnt. | Įtaisų kaina, eur. |
| ID | Vardas | Įtaisų kiekis, vnt. | Įtaisų kaina, eur. |
------------------------------------------------------------
| 2 | Laidas | 220 | 440.00 |
| 2 | Laidas | 220 | 440.00 |
------------------------------------------------------------
----------------------------------------------------------
| Vienos rūšies pirkėjai |
----------------------------------------------------------
| Pavardė | Vardas | Įtaiso kiekis, vnt. | Kaina, eur. |
| Pavardė | Vardas | Įtaiso kiekis, vnt. | Kaina, eur. |
----------------------------------------------------------
| Nėra |
----------------------------------------------------------
@ -47,9 +47,9 @@
----------------------------------
| Atrinkti įtaisai (n=1, k=1.00) |
----------------------------------
| ID | Vardas | Kaina |
| ID | Vardas | Kaina |
----------------------------------
| 0 | Atsuktuvas | 0.99 |
| 1 | Varztas | 0.05 |
| 0 | Atsuktuvas | 0.99 |
| 1 | Varztas | 0.05 |
----------------------------------

View File

@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
@ -124,18 +125,59 @@ namespace LD_24.Code
/// <param name="writer">Target file</param>
/// <param name="cells">Cell data</param>
/// <param name="widths">Cell widths</param>
private static void PrintTableRow(StreamWriter writer, List<string> cells, List<int> widths)
private static void PrintTableRow(StreamWriter writer, LinkedList<string> cells, LinkedList<int> widths)
{
for (int i = 0; i < widths.Count; i++)
foreach (var tuple in cells.Zip(widths, (a, b) => Tuple.Create(a, b)))
{
if (widths[i] > 0)
writer.Write("| {0} ", cells[i].PadRight(widths[i]));
if (tuple.Item1[0] == '-')
writer.Write("| {0} ", tuple.Item1.Substring(1).PadRight(tuple.Item2));
else
writer.Write("| {0} ", cells[i].PadLeft(-widths[i]));
writer.Write("| {0} ", tuple.Item1.PadLeft(tuple.Item2));
}
writer.WriteLine("|");
}
private static LinkedList<int> FindTableWidths(LinkedList<LinkedList<string>> rows, string header, string[] columns)
{
var allWidths = new Dictionary<int, LinkedList<int>>();
int o = 0;
foreach (var column in columns)
{
allWidths.Add(o, new LinkedList<int> { column.Length });
o++;
}
foreach (var row in rows)
{
int p = 0;
foreach (var cell in row)
{
allWidths[p].Add(cell.Length);
p++;
}
}
var widths = new LinkedList<int>();
int totalWidth = 3 * (columns.Length - 1);
foreach (var columnWidths in allWidths.Values)
{
int width = columnWidths.Max();
totalWidth += width;
widths.Add(width);
}
// If the header is longer than the body, make the last column wider.
// So the table is a nice rectangle when output to the file
if (header.Length > totalWidth)
{
// Make the last column a bit wider so everything lines up
widths.Add(widths.RemoveLast() + header.Length - totalWidth);
}
return widths;
}
/// <summary>
/// Print a table to a file
/// </summary>
@ -144,58 +186,28 @@ namespace LD_24.Code
/// <param name="list">Target list</param>
/// <param name="columns">Column names</param>
/// <returns>A IEnumerable for inserting values for each row</returns>
private static IEnumerable<Tuple<T, List<string>>> PrintTable<T>(StreamWriter writer, string header, IEnumerable<T> list, params string[] columns)
private static IEnumerable<Tuple<T, LinkedList<string>>> PrintTable<T>(StreamWriter writer, string header, IEnumerable<T> list, params string[] columns)
{
// 0. Collect all the rows
List<List<string>> rows = new List<List<string>>();
// 1. Collect all the rows
LinkedList<LinkedList<string>> rows = new LinkedList<LinkedList<string>>();
foreach (T item in list)
{
List<string> row = new List<string>();
var row = new LinkedList<string>();
yield return Tuple.Create(item, row);
rows.Add(row);
}
// 1. Determine the width of each column
List<int> widths = new List<int>();
int totalWidth = 3*(columns.Length - 1);
for (int i = 0; i < columns.Length; i++)
{
int width = columns[i].Length;
foreach (var row in rows)
{
width = Math.Max(row[i].Length, width);
}
widths.Add(width);
totalWidth += width;
}
// If the header is longer than the body, make the last column wider.
// So the table is a nice rectangle when output to the file
if (header.Length > totalWidth)
{
widths[widths.Count - 1] += (header.Length - totalWidth);
totalWidth = header.Length;
}
totalWidth += 2 * 2;
// 2. Adjust widths to account for aligning
for (int i = 0; i < columns.Length; i++)
{
if (columns[i][0] == '-')
{
widths[i] = -widths[i];
columns[i] = columns[i].Substring(1);
}
}
// 2. Determine the width of each column
var widths = FindTableWidths(rows, header, columns);
int totalWidth = 3 * (columns.Length - 1) + 2 * 2 + widths.Sum();
// 3. Display the table
writer.WriteLine(new string('-', totalWidth));
writer.WriteLine("| {0} |", header.PadRight(totalWidth - 4));
writer.WriteLine(new string('-', totalWidth));
PrintTableRow(writer, new List<string>(columns), widths);
PrintTableRow(writer, new LinkedList<string>(columns), widths);
writer.WriteLine(new string('-', totalWidth));
if (rows.Count > 0)
if (!rows.IsEmpty())
{
foreach (var row in rows)
{
@ -221,7 +233,7 @@ namespace LD_24.Code
foreach (var tuple in PrintTable(writer, header, orders, "Pavardė", "Vardas", "-Įtaisas", "-Įtaiso kiekis"))
{
Order order = tuple.Item1;
List<string> row = tuple.Item2;
var row = tuple.Item2;
row.Add(order.CustomerSurname);
row.Add(order.CustomerName);
row.Add(order.ProductID);
@ -241,7 +253,7 @@ namespace LD_24.Code
foreach (var tuple in PrintTable(writer, header, orders, "Pavardė", "Vardas", "-Įtaiso kiekis, vnt.", "-Kaina, eur."))
{
Order order = tuple.Item1;
List<string> row = tuple.Item2;
var row = tuple.Item2;
Product product = TaskUtils.FindByID(products, order.ProductID);
row.Add(order.CustomerSurname);
@ -262,7 +274,7 @@ namespace LD_24.Code
foreach (var tuple in PrintTable(writer, header, products, "ID", "Vardas", "-Kaina"))
{
Product product = tuple.Item1;
List<string> row = tuple.Item2;
var row = tuple.Item2;
row.Add(product.ID);
row.Add(product.Name);
row.Add(string.Format("{0:f2}", product.Price));
@ -281,7 +293,7 @@ namespace LD_24.Code
foreach (var tuple in PrintTable(writer, header, popularProducts, "ID", "Vardas", "-Įtaisų kiekis, vnt.", "-Įtaisų kaina, eur."))
{
Product product = tuple.Item1;
List<string> row = tuple.Item2;
var row = tuple.Item2;
int sales = TaskUtils.CountProductSales(orders, product.ID);
row.Add(product.ID);
row.Add(product.Name);

View File

@ -6,8 +6,12 @@ using System.Web;
namespace LD_24.Code
{
public class LinkedList<T> : IEnumerable<T>
where T: IComparable<T>, IEquatable<T>
/// <summary>
/// Generic linked list class. Used for storing a list of values.
/// </summary>
/// <typeparam name="T">Target type</typeparam>
public class LinkedList<T> : IEnumerable<T>, IComparable<LinkedList<T>>, IEquatable<LinkedList<T>>
where T : IComparable<T>, IEquatable<T>
{
class Node
{
@ -24,9 +28,32 @@ namespace LD_24.Code
private Node head;
private Node tail;
public void Add(T customer)
/// <summary>
/// Creates an empty linked list
/// </summary>
public LinkedList()
{
Node node = new Node(customer);
}
/// <summary>
/// Creates an clone of a given enumerable value/list
/// </summary>
/// <param name="other">Cloned enumerable</param>
public LinkedList(IEnumerable<T> other)
{
foreach (var value in other)
{
Add(value);
}
}
/// <summary>
/// Add a single element to the linked list
/// </summary>
/// <param name="value"></param>
public void Add(T value)
{
Node node = new Node(value);
if (tail != null && head != null)
{
tail.Next = node;
@ -39,6 +66,62 @@ namespace LD_24.Code
}
}
/// <summary>
/// Removes the last element from this list
/// </summary>
/// <returns>The last elements values or the default value if empty</returns>
public T RemoveLast()
{
if (head == null)
{
return default;
}
Node prev = null;
Node current = head;
while (current.Next != null)
{
prev = current;
current = current.Next;
}
if (prev != null)
{
prev.Next = null;
tail = prev;
}
if (prev == null)
{
head = null;
tail = null;
}
return current.Data;
}
/// <summary>
/// Gets the first element
/// </summary>
/// <returns>The first element</returns>
public T GetFirst()
{
return head != null ? head.Data : default;
}
/// <summary>
/// Gets the first element
/// </summary>
/// <returns>The first element</returns>
public T GetLast()
{
return tail != null ? tail.Data : default;
}
/// <summary>
/// Count how many elemnts are stored in this list
/// </summary>
/// <returns>Number of stored elements</returns>
public int Count()
{
int count = 0;
@ -49,11 +132,19 @@ namespace LD_24.Code
return count;
}
/// <summary>
/// Returns true if the linked list is empty,
/// what did you expect?
/// </summary>
/// <returns>A boolean</returns>
public bool IsEmpty()
{
return head == null;
}
/// <summary>
/// Sorts this linked list
/// </summary>
public void Sort()
{
for (Node nodeA = head; nodeA != null; nodeA = nodeA.Next)
@ -73,20 +164,99 @@ namespace LD_24.Code
}
}
/// <summary>
/// A human-readable string for debuging purposes
/// </summary>
/// <returns>Debug string</returns>
public override string ToString()
{
return String.Format("LinkedList<{0}>{ Count = '{0}' }", Count());
return string.Format("LinkedList<{0}>( Count = {0} )", Count());
}
/// <summary>
/// Enumerate over all the elements of the list
/// </summary>
/// <returns>An enumerator</returns>
public IEnumerator<T> GetEnumerator()
{
for (Node d = head; d != null; d = d.Next)
yield return d.Data;
}
/// <summary>
/// Enumerate over all the elements of the list
/// </summary>
/// <returns>An enumerator</returns>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
/// <summary>
/// Compares the ordering 2 lists
/// </summary>
/// <param name="other">Other list</param>
/// <returns></returns>
public int CompareTo(LinkedList<T> other)
{
var otherEnumerator = other.GetEnumerator();
foreach (var value in this)
{
if (otherEnumerator.MoveNext())
{
int comparison = value.CompareTo(otherEnumerator.Current);
if (comparison != 0)
{
return comparison;
}
} else
{
return -1;
}
}
if (otherEnumerator.MoveNext())
{
return 1;
}
return 0;
}
/// <summary>
/// Checks if 2 linked lists have the same values stored
/// </summary>
/// <param name="other">Other linked list</param>
/// <returns>True if they both store the same values</returns>
public bool Equals(LinkedList<T> other)
{
var otherEnumerator = other.GetEnumerator();
foreach (var value in this)
{
if (otherEnumerator.MoveNext())
{
if (!value.Equals(otherEnumerator.Current))
{
// This is the case, when some elements in between the lists are different
return false;
}
}
else
{
// This is the case when the other linked list runs out of values, while this still has more.
return false;
}
}
if (otherEnumerator.MoveNext())
{
// This is the case, when the other linked list still had some left over values.
// That means it had more elements that this one.
return false;
}
// This is the case, when everything is the same.
return true;
}
}
}

View File

@ -27,6 +27,13 @@ namespace LD_24.Code
/// </summary>
public int ProductAmount { get; set; }
/// <summary>
/// Creates a new order
/// </summary>
/// <param name="customerSurname">The customers surname</param>
/// <param name="customerName">The customers name</param>
/// <param name="productID">Product ID</param>
/// <param name="productAmount">Product amount</param>
public Order(string customerSurname, string customerName, string productID, int productAmount)
{
CustomerSurname = customerSurname;
@ -35,11 +42,11 @@ namespace LD_24.Code
ProductAmount = productAmount;
}
public override string ToString()
{
return String.Format("Order{Name = '{0}'}", CustomerName);
}
/// <summary>
/// Compares the sorting order of this and other.
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public int CompareTo(Order other)
{
if (ProductAmount > other.ProductAmount)
@ -62,6 +69,11 @@ namespace LD_24.Code
return Equals(other) ? 0 : -1;
}
/// <summary>
/// Compare if this order has the same sorting order as another one.
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public bool Equals(Order other)
{
return CustomerSurname == other.CustomerSurname &&
@ -79,5 +91,10 @@ namespace LD_24.Code
hashCode = hashCode * -1521134295 + ProductAmount.GetHashCode();
return hashCode;
}
public override string ToString()
{
return String.Format("Order{Name = '{0}'}", CustomerName);
}
}
}

View File

@ -23,6 +23,12 @@ namespace LD_24.Code
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// Creates a new product
/// </summary>
/// <param name="iD">ID</param>
/// <param name="name">Name</param>
/// <param name="price">Price</param>
public Product(string iD, string name, decimal price)
{
ID = iD;
@ -30,11 +36,11 @@ namespace LD_24.Code
Price = price;
}
public override string ToString()
{
return String.Format("Product{ID = '{0}'}", ID);
}
/// <summary>
/// Check if this has the same sorting order as othe product
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public bool Equals(Product other)
{
return ID == other.ID &&
@ -55,5 +61,10 @@ namespace LD_24.Code
{
return ID.CompareTo(other.ID);
}
public override string ToString()
{
return String.Format("Product{ID = '{0}'}", ID);
}
}
}

View File

@ -17,11 +17,21 @@ namespace LD_24
{
private const string outputFilename = "App_Data/Rezultatai.txt";
/// <summary>
/// Function that runs when the page loads
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
FindControl("ResultsDiv").Visible = false;
}
/// <summary>
/// Functions that rusn when the button is clicked
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
int n = int.Parse(TextBox1.Text);

View File

@ -1,27 +1,238 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
https://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.6.1"/>
<httpRuntime targetFramework="4.6.1"/>
<globalization fileEncoding="utf-8" />
<globalization fileEncoding="utf-8"/>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
</compilers>
</system.codedom>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XmlSerializer" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XDocument" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="CC7B13FFCD2DDD51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Timer" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Parallel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.RegularExpressions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.SecureString" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Principal" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Xml" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Json" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Numerics" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Resources.ResourceManager" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ObjectModel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Requests" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Primitives" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.NetworkInformation" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Queryable" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Parallel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Expressions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="B77A5C561934E089" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Globalization.Extensions" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Globalization" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Dynamic.Runtime" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tools" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Debug" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Contracts" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Data.Common" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.EventBasedAsync" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Concurrent" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -0,0 +1,17 @@
using System;
using System.Text;
using LD_24.Code;
using Bogus;
namespace LD_24Tests
{
public class IntLinkedListTests : LinkedListTests<int>
{
private readonly Faker faker = new Faker("en");
protected override int CreateItem()
{
return faker.Random.Number(100);
}
}
}

View File

@ -8,7 +8,7 @@
<ItemGroup>
<PackageReference Include="Bogus" Version="34.0.1" />
<PackageReference Include="FluentAssertions" Version="6.5.1" />
<PackageReference Include="FluentAssertions" Version="6.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.abstractions" Version="2.0.3" />

View File

@ -3,71 +3,346 @@ using Xunit;
using FluentAssertions;
using LD_24.Code;
using System.Collections;
using System.Linq;
namespace LD_24Tests
{
public abstract class LinkedListTests<T>
where T : IComparable<T>, IEquatable<T>
{
protected abstract LinkedList<T> CreateNewList();
protected abstract T CreateItem();
[Fact]
public void New_List_Is_Empty()
private LinkedList<T> CreateLoadedList(int count)
{
LinkedList<T> list = CreateNewList();
list.IsEmpty().Should().BeTrue();
}
[Fact]
public void Assert_List_Is_Not_Empty()
{
LinkedList<T> list = CreateNewList();
list.Add(CreateItem());
list.IsEmpty().Should().BeFalse();
}
[Theory]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Retrieve_How_Many_Were_Added(int count)
{
LinkedList<T> list = CreateNewList();
var list = new LinkedList<T>();
for (int i = 0; i < count; i++)
{
list.Add(CreateItem());
}
return list;
}
[Fact]
[Trait("TestedMethod", "Constructor")]
public void CreatingList_Shouldnt_Throw()
{
Action action = () => new LinkedList<T>();
action.Should().NotThrow();
}
[Theory]
[Trait("TestedMethod", "Constructor")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void CreateList_From_Other_List(int count)
{
var list = CreateLoadedList(count);
var newList = new LinkedList<T>(list);
list.Equals(newList).Should().BeTrue();
}
[Theory]
[Trait("TestedMethod", "Add")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Adding_Should_Not_Throw(int count)
{
LinkedList<T> list = CreateLoadedList(count);
Action task = () => list.Add(CreateItem());
task.Should().NotThrow();
}
[Fact]
[Trait("TestedMethod", "IsEmpty")]
public void New_List_Is_Empty()
{
LinkedList<T> list = new LinkedList<T>();
list.IsEmpty().Should().BeTrue();
}
[Fact]
[Trait("TestedMethod", "IsEmpty")]
public void Assert_List_Is_Not_Empty()
{
LinkedList<T> list = new LinkedList<T>();
list.Add(CreateItem());
list.IsEmpty().Should().BeFalse();
}
[Theory]
[Trait("TestedMethod", "IsEmpty")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Is_Empty_Should_Not_Throw(int count)
{
LinkedList<T> list = CreateLoadedList(count);
Action task = () => list.Add(CreateItem());
task.Should().NotThrow();
}
[Theory]
[Trait("TestedMethod", "Count")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Retrieve_How_Many_Were_Added(int count)
{
LinkedList<T> list = CreateLoadedList(count);
list.Count().Should().Be(count);
}
[Fact]
public void IEnumerable_Is_Implemented_Correctly()
[Trait("TestedMethod", "GetLast")]
public void Assert_Last_Element_When_Empty_Doesnt_Throw()
{
LinkedList<T> list = CreateNewList();
LinkedList<T> list = new LinkedList<T>();
Func<T> task = () => list.GetLast();
var item1 = CreateItem();
var item2 = CreateItem();
var item3 = CreateItem();
task.Should().NotThrow();
}
list.Add(item1);
list.Add(item2);
list.Add(item3);
[Theory]
[Trait("TestedMethod", "GetLast")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Assert_Last_Element_Value(int count)
{
var list = CreateLoadedList(count);
var last = CreateItem();
list.Add(last);
var newList = new System.Collections.Generic.List<T>();
foreach (var item in list)
list.GetLast().Should().Be(last);
}
[Fact]
[Trait("TestedMethod", "GetFirst")]
public void Assert_First_Element_When_Empty()
{
LinkedList<T> list = new LinkedList<T>();
list.GetFirst().Should().Be(default);
}
[Fact]
[Trait("TestedMethod", "GetFirst")]
public void Assert_First_Element_When_Empty_Doesnt_Throw()
{
LinkedList<T> list = new LinkedList<T>();
Func<T> task = () => list.GetFirst();
task.Should().NotThrow();
}
[Theory]
[Trait("TestedMethod", "GetFirst")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Assert_First_Element_Value(int count)
{
var list = new LinkedList<T>();
var first = CreateItem();
list.Add(first);
for (int i = 0; i < count; i++)
list.Add(CreateItem());
list.GetFirst().Should().Be(first);
}
[Theory]
[Trait("TestedMethod", "RemoveLast")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void RemoveLast_Shouldnt_Throw(int count)
{
var list = CreateLoadedList(count);
Action action = () => list.RemoveLast();
action.Should().NotThrow();
}
[Theory]
[Trait("TestedMethod", "RemoveLast")]
[InlineData(1)]
[InlineData(5)]
public void RemoveLast_Returns_Removed_Value(int count)
{
var list = CreateLoadedList(count);
var last = list.GetLast();
list.RemoveLast().Should().Be(last);
}
[Theory]
[Trait("TestedMethod", "RemoveLast")]
[InlineData(1)]
[InlineData(5)]
public void After_RemoveLast_Length_Should_Decrease(int count)
{
var list = CreateLoadedList(count);
list.RemoveLast();
list.Count().Should().Be(count-1);
}
[Fact]
[Trait("TestedMethod", "RemoveLast")]
public void RemoveLast_Does_Nothing_In_Empty_List()
{
var list = new LinkedList<T>();
list.RemoveLast();
list.Count().Should().Be(0);
}
[Fact]
[Trait("TestedMethod", "RemoveLast")]
public void RemoveLast_Returns_Default_In_Empty_List()
{
var list = new LinkedList<T>();
list.RemoveLast().Should().Be(default);
}
[Theory]
[Trait("TestedMethod", "IEnumerable")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void IEnumerable_Is_Implemented_Correctly(int count)
{
var genericList = new System.Collections.Generic.List<T>();
LinkedList<T> list = new LinkedList<T>();
for (int i = 0; i < count; i++)
{
newList.Add(item);
var item = CreateItem();
list.Add(item);
genericList.Add(item);
}
newList[0].Should().Be(item1);
newList[1].Should().Be(item2);
newList[2].Should().Be(item3);
// Checks the enumerators "list" and "genericList" contain the same values
genericList.Zip(list, (a, b) => a.Equals(b)).All((t) => t).Should();
}
[Fact]
[Trait("TestedMethod", "ToString")]
public void Assert_ToString_Is_Overridden()
{
var list = new LinkedList<T>();
Assert.True(list.ToString() != list.GetType().ToString());
}
[Theory]
[Trait("TestedMethod", "Equals")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Check_If_Lists_Are_Equal(int count)
{
var list1 = CreateLoadedList(count);
var list2 = new LinkedList<T>(list1);
list1.Equals(list2).Should().BeTrue();
}
[Theory]
[Trait("TestedMethod", "Equals")]
[InlineData(1)]
[InlineData(5)]
public void Check_If_Lists_Arent_Equal(int count)
{
var list1 = CreateLoadedList(count);
var list2 = CreateLoadedList(count);
list1.Equals(list2).Should().BeFalse();
}
[Theory]
[Trait("TestedMethod", "Equals")]
[InlineData(1)]
[InlineData(5)]
public void Check_If_Lists_Arent_Equal_By_Size(int count)
{
var list1 = CreateLoadedList(count);
var list2 = new LinkedList<T>(list1);
list2.RemoveLast();
list1.Equals(list2).Should().BeFalse();
}
[Theory]
[Trait("TestedMethod", "Sort")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Sort_Shouldnt_Throw(int count)
{
var list = CreateLoadedList(count);
Action action = () => list.Sort();
action.Should().NotThrow();
}
[Fact]
[Trait("TestedMethod", "Sort")]
public void Sort_Does_Nothing_On_Empty_List()
{
var list = new LinkedList<T>();
var listCopy = new LinkedList<T>(list);
list.Sort();
list.Equals(listCopy).Should().BeTrue();
}
[Theory]
[Trait("TestedMethod", "Sort")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Items_In_Correct_Order_After_Sort(int count)
{
var list = CreateLoadedList(count);
list.Sort();
var itemPairs = list.Zip(list.Skip(1), (a, b) => Tuple.Create(a, b));
foreach (var tuple in itemPairs)
{
Assert.True(tuple.Item1.CompareTo(tuple.Item2) >= 0);
}
}
[Theory]
[Trait("TestedMethod", "Sort")]
[InlineData(0)]
[InlineData(1)]
[InlineData(5)]
public void Does_Nothing_If_Already_Sorted(int count)
{
var list = CreateLoadedList(count);
list.Sort();
var listCopy = new LinkedList<T>(list);
list.Sort();
list.Equals(listCopy).Should().BeTrue();
}
}
}

View File

@ -7,9 +7,8 @@ namespace LD_24Tests
{
public class OrderLinkedListTests : LinkedListTests<Order>
{
private Faker faker = new Faker("en");
private readonly Faker faker = new Faker("en");
protected override LinkedList<Order> CreateNewList() => new LinkedList<Order>();
protected override Order CreateItem()
{
string customerSurname = faker.Name.FindName();

View File

@ -0,0 +1,17 @@
using System;
using System.Text;
using Bogus;
using LD_24.Code;
namespace LD_24Tests
{
public class StringLinkedListTests : LinkedListTests<string>
{
private readonly Faker faker = new Faker("en");
protected override string CreateItem()
{
return faker.Name.FullName();
}
}
}