Skip to content
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
68 changes: 68 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,71 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/


### DOTNET SECTION ###
## A streamlined .gitignore for modern .NET projects
## including temporary files, build results, and
## files generated by popular .NET tools. If you are
## developing with Visual Studio, the VS .gitignore
## https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
## has more thorough IDE-specific entries.
##
## Get latest from https://github.com/github/gitignore/blob/main/Dotnet.gitignore

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg

# Others
~$*
*~
CodeCoverage/

# MSBuild Binary and Structured Log
*.binlog

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# SonarQube
.sonar/
.scannerwork/
.sonarqube/
sonar-project.properties
.sonarlint/
.sonarwork/
reports/

copilot.sln
22 changes: 22 additions & 0 deletions DotnetApp.Tests/DotnetApp.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="../DotnetApp/DotnetApp.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.4">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
</ItemGroup>

</Project>
149 changes: 149 additions & 0 deletions DotnetApp.Tests/Models/TestItemTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
using System;
using Xunit;
using DotnetApp.Models;

namespace DotnetApp.Models.Tests
{
public class TaskItemTest
{
[Fact]
public void CalculateTaskScore_ShouldReturnCorrectScore_ForPriorityZero()
{
// Arrange
var task = new TaskItem
{
Priority = 0,
Status = "pending",
CreatedAt = DateTime.UtcNow.AddDays(-1),
IsCompleted = false,
Title = "Test Task"
};

// Act
var score = task.CalculateTaskScore();

// Assert
Assert.Equal(1, score);
}

[Fact]
public void CalculateTaskScore_ShouldReturnCorrectScore_ForPriorityOneAndPendingStatus()
{
// Arrange
var task = new TaskItem
{
Priority = 1,
Status = "pending",
CreatedAt = DateTime.UtcNow.AddDays(-1),
IsCompleted = false,
Title = "Test Task"
};

// Act
var score = task.CalculateTaskScore();

// Assert
Assert.Equal(13, score);
}

[Fact]
public void CalculateTaskScore_ShouldReturnCorrectScore_ForPriorityTwoAndInProgressStatus()
{
// Arrange
var task = new TaskItem
{
Priority = 2,
Status = "in-progress",
CreatedAt = DateTime.UtcNow.AddDays(-8),
IsCompleted = false,
Title = "Test Task"
};

// Act
var score = task.CalculateTaskScore();

// Assert
Assert.Equal(10, score);
}

[Fact]
public void CalculateTaskScore_ShouldDoubleScore_ForPendingStatusAndOldTask()
{
// Arrange
var task = new TaskItem
{
Priority = 2,
Status = "pending",
CreatedAt = DateTime.UtcNow.AddDays(-15),
IsCompleted = false,
Title = "Test Task"
};

// Act
var score = task.CalculateTaskScore();

// Assert
Assert.Equal(15, score);
}

[Fact]
public void CalculateTaskScore_ShouldSubtractScore_ForCompletedInProgressTask()
{
// Arrange
var task = new TaskItem
{
Priority = 2,
Status = "in-progress",
CreatedAt = DateTime.UtcNow.AddDays(-1),
IsCompleted = true,
Title = "Test Task"
};

// Act
var score = task.CalculateTaskScore();

// Assert
Assert.Equal(0, score);
}

[Fact]
public void CalculateTaskScore_ShouldAddScore_ForLongWordsInTitle()
{
// Arrange
var task = new TaskItem
{
Priority = 3,
Status = "in-progress",
CreatedAt = DateTime.UtcNow.AddDays(-1),
IsCompleted = false,
Title = "ThisIsAVeryLongWord Task"
};

// Act
var score = task.CalculateTaskScore();

// Assert
Assert.Equal(2, score);
}

[Fact]
public void CalculateTaskScore_ShouldReturnZero_ForNegativeScore()
{
// Arrange
var task = new TaskItem
{
Priority = 3,
Status = "completed",
CreatedAt = DateTime.UtcNow.AddDays(-1),
IsCompleted = true,
Title = "Test Task"
};

// Act
var score = task.CalculateTaskScore();

// Assert
Assert.Equal(1, score);
}
}
}
102 changes: 102 additions & 0 deletions DotnetApp.Tests/Services/InMemoryTaskServiceTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
using System.Linq;
using DotnetApp.Models;
using DotnetApp.Services;
using Xunit;

namespace DotnetApp.Tests.Services
{
public class InMemoryTaskServiceTests
{
[Fact]
public void CreateTask_AssignsIdAndStoresTask()
{
var service = new InMemoryTaskService();
var task = new TaskItem { Title = "Test Task" };

service.CreateTask(task);

Assert.NotEqual(0, task.Id);
var all = service.GetAllTasks().ToList();
Assert.Contains(all, t => t.Id == task.Id && t.Title == "Test Task");
}

[Fact]
public void GetTaskById_ReturnsCorrectTaskOrNull()
{
var service = new InMemoryTaskService();
var task = new TaskItem { Title = "GetById" };
service.CreateTask(task);
var id = task.Id;

var found = service.GetTaskById(id);
Assert.NotNull(found);
Assert.Equal("GetById", found.Title);

var missing = service.GetTaskById(id + 999);
Assert.Null(missing);
}

[Fact]
public void UpdateTask_NonExisting_ReturnsFalse()
{
var service = new InMemoryTaskService();
var updated = new TaskItem { Title = "Nope" };

var result = service.UpdateTask(999, updated);
Assert.False(result);
}

[Fact]
public void UpdateTask_Existing_ReturnsTrueAndUpdates()
{
var service = new InMemoryTaskService();
var task = new TaskItem { Title = "Original" };
service.CreateTask(task);
var id = task.Id;

var updated = new TaskItem { Title = "Updated" };
var result = service.UpdateTask(id, updated);

Assert.True(result);
Assert.Equal(id, updated.Id);
var fetched = service.GetTaskById(id);
Assert.Equal("Updated", fetched.Title);
}

[Fact]
public void DeleteTask_ReturnsTrueOnceAndRemoves()
{
var service = new InMemoryTaskService();
var task = new TaskItem { Title = "ToDelete" };
service.CreateTask(task);
var id = task.Id;

var first = service.DeleteTask(id);
var second = service.DeleteTask(id);

Assert.True(first);
Assert.False(second);
Assert.Null(service.GetTaskById(id));
}

[Fact]
public void GetAllTasks_Empty_ReturnsEmpty()
{
var service = new InMemoryTaskService();
var all = service.GetAllTasks().ToList();
Assert.Empty(all);
}

[Fact]
public void CreateTask_SequentialIds()
{
var service = new InMemoryTaskService();
var t1 = new TaskItem { Title = "First" };
service.CreateTask(t1);
var t2 = new TaskItem { Title = "Second" };
service.CreateTask(t2);

Assert.Equal(t1.Id + 1, t2.Id);
}
}
}
14 changes: 14 additions & 0 deletions DotnetApp/DotnetApp.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<RootNamespace>DotnetApp</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>

</Project>
Loading