Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ public IActionResult Index()
var qrCodes = new Dictionary<string, string>
{
{ "Basic String", GenerateQRCodeString() },
{ "SVG", GenerateQRCodeSvg() },
{ "URL", GenerateQRCodeURL() },
{ "Phone Number", GenerateQRCodePhoneNumber() },
{ "Custom", GenerateQRCodeCustom() }
{ "Custom", GenerateQRCodeCustom() },
{ "Branded", GenerateQRCodeBranded() }
};

var model = new HomeModel(qrCodes);
Expand All @@ -25,7 +27,7 @@ public IActionResult Index()
}

private string GenerateQRCodeCustom()
{
{
const string key = "Custom";

var raw = db.Get(key);
Expand All @@ -41,11 +43,20 @@ private string GenerateQRCodeCustom()

private string GenerateQRCodeString()
{
var qrCodeData = qrGenerator.CreateQrCode("Hello CodeMaze readers", QRCodeGenerator.ECCLevel.Q);
var qrCodeData = qrGenerator.CreateQrCode("Hello CodeMaze readers :)", QRCodeGenerator.ECCLevel.Q);

return GeneratePng(qrCodeData);
}

private string GenerateQRCodeSvg()
{
var qrCodeData = qrGenerator.CreateQrCode("Hello CodeMaze readers :)", QRCodeGenerator.ECCLevel.Q);
using var qrCode = new SvgQRCode(qrCodeData);
var svg = qrCode.GetGraphic(20);

return $"data:image/svg+xml,{Uri.EscapeDataString(svg)}";
}

private string GenerateQRCodeURL()
{
var qrCodeData = qrGenerator.CreateQrCode(new Url("https://www.code-maze.com"));
Expand All @@ -60,7 +71,22 @@ private string GenerateQRCodePhoneNumber()
return GeneratePng(qrCodeData);
}

private string GenerateQRCodeBranded()
{
var qrCodeData = qrGenerator.CreateQrCode("Hello CodeMaze readers :)", QRCodeGenerator.ECCLevel.Q);

return GeneratePngBranded(qrCodeData);
}

private static string GeneratePng(QRCodeData data)
{
using var qrCode = new PngByteQRCode(data);
var qrCodeImage = qrCode.GetGraphic(20);

return $"data:image/png;base64,{Convert.ToBase64String(qrCodeImage)}";
}

private static string GeneratePngBranded(QRCodeData data)
{
using var qrCode = new PngByteQRCode(data);
var qrCodeImage = qrCode.GetGraphic(20, [255, 0, 0], [0, 0, 139]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();

app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
pattern: "{controller=Home}/{action=Index}/{id?}")
.WithStaticAssets();

app.Run();
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="QRCoder" Version="1.4.1" />
<PackageReference Include="QRCoder" Version="1.8.0" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
using QRCoder;
using System.Collections.Concurrent;
using QRCoder;

namespace QRCodeGeneratorWebSample;

public class QrCodesDb
{
private readonly Dictionary<string, byte[]> _qrCodes = [];
private readonly ConcurrentDictionary<string, byte[]> _qrCodes = new();

public void Add(string key, QRCodeData data)
{
if (!_qrCodes.ContainsKey(key))
{
_qrCodes.Add(key, data.GetRawData(QRCodeData.Compression.Uncompressed));
}
_qrCodes.TryAdd(key, data.GetRawData(QRCodeData.Compression.Uncompressed));
}

public byte[]? Get(string key)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
@model HomeModel;
@model HomeModel

<div class="text-center">
@foreach (var qr in Model.QRCodes)
{
<hr/>
<h2>@qr.Key</h2>
<img width="250px" src="@qr.Value" />
}
}
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,65 @@
namespace Tests;
public class QRCodeGeneratorWebSampleUnitTest
{
[Fact]
public void GivenARequest_WhenCallingIndex_ThenTheControllerRendersAViewWithQrCodes()
private static HomeModel RenderIndex()
{
// Arrange.
var db = new QrCodesDb();
var controller = new HomeController(db);

// Act.
var viewResult = controller.Index() as ViewResult;

// Assert.
Assert.NotNull(viewResult);
var model = viewResult.Model as HomeModel;
Assert.NotNull(model);

return model;
}

[Fact]
public void GivenARequest_WhenCallingIndex_ThenTheControllerRendersAViewWithQrCodes()
{
// Act.
var model = RenderIndex();

// Assert.
Assert.NotNull(model.QRCodes);
Assert.NotEmpty(model.QRCodes);
foreach (var qrCode in from expectedKey in new[] { "Basic String", "URL", "Phone Number", "Custom" }
foreach (var qrCode in from expectedKey in new[] { "Basic String", "SVG", "URL", "Phone Number", "Custom", "Branded" }
let qrCode = model.QRCodes[expectedKey]
select qrCode)
{
Assert.NotNull(qrCode);
}
}
}

[Fact]
public void GivenARequest_WhenCallingIndex_ThenThePngRendererProducesARealPng()
{
// Arrange.
const string prefix = "data:image/png;base64,";

// Act.
var dataUri = RenderIndex().QRCodes["Basic String"];

// Assert.
Assert.StartsWith(prefix, dataUri);
var bytes = Convert.FromBase64String(dataUri[prefix.Length..]);
Assert.Equal(new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, bytes[..8]);
}

[Fact]
public void GivenARequest_WhenCallingIndex_ThenTheSvgRendererProducesAnSvgDocument()
{
// Arrange.
const string prefix = "data:image/svg+xml,";

// Act.
var dataUri = RenderIndex().QRCodes["SVG"];

// Assert.
Assert.StartsWith(prefix, dataUri);
var svg = Uri.UnescapeDataString(dataUri[prefix.Length..]);
Assert.Contains("<svg", svg);
Assert.Contains("</svg>", svg);
}
}
10 changes: 5 additions & 5 deletions dotnet-client-libraries/QRCoder/Tests/Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,10 +10,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
<PackageReference Include="coverlet.collector" Version="10.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.10.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="4.0.1" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading