LPRun 7.7.3

There is a newer version of this package available.
See the version list below for details.
dotnet add package LPRun --version 7.7.3                
NuGet\Install-Package LPRun -Version 7.7.3                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="LPRun" Version="7.7.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add LPRun --version 7.7.3                
#r "nuget: LPRun, 7.7.3"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install LPRun as a Cake Addin
#addin nuget:?package=LPRun&version=7.7.3

// Install LPRun as a Cake Tool
#tool nuget:?package=LPRun&version=7.7.3                

Latest build NuGet Downloads License

LINQPad Driver LPRun Unit/Integration Tests Runner

Table of Contents

Description

LINQPad driver LPRun unit/integration tests runner. Can be used for testing LINQPad 7/LINQPad 6 drivers using LPRun or for running LINQPad scripts.

Website

LPRun is a part of CsvLINQPadDriver for LINQPad 7/6/5. LPRun source code can be found here.

Download

NuGet

Usage

Tested driver MUST NOT be installed via NuGet into LINQPad. In this case LPRun will use it instead of local one.

Setup

  1. Create test project.
  2. Add LPRun NuGet
  3. Create the following folder structure in test project:
LPRun # Created by LPRun NuGet.
    Templates # LINQPad script templates.
    Data      # Optional: Driver data files.

LINQPad Test Script Example

LPRun executes LINQPad test script. Test script uses Fluent Assertions for assertion checks.

StringComparison.linq LINQPad test script example:

var original = Books.First();
var copy = original with { Title = original.Title.ToUpper() };

var expectedEquality = original.Title.Equals(copy.Title, context.StringComparison);

original.Equals(copy).Should().Be(expectedEquality, Reason());

original.GetHashCode()
    .Equals(copy.GetHashCode())
    .Should()
    .Be(expectedEquality, Reason());

Reason() method (prints exact line number if assertion fails) and context variable are injected by test below.

NUnit Test Example

Full NUnit test code can be found here.

[TestFixture]
public class LPRunTests
{
    [OneTimeSetUp]
    public void Init() =>
        // Copy driver to LPRun drivers folder.
        Driver.InstallWithDepsJson(
            // The directory to copy driver files to.
            "CsvLINQPadDriver",
            // The LINQPad driver files.
            "CsvLINQPadDriver.dll",
            // The test folder path.
            "Tests");

    [Test]
    [TestCaseSource(nameof(TestsData))]
    public void Execute_ScriptWithDriverProperties_Success(
        (string linqScriptName,
         string? context,
         ICsvDataContextDriverProperties driverProperties) testData)
    {
        var (linqScriptName, context, driverProperties) = testData;

        // Arrange: Create query connection header. Custom code can be added here.
        var queryConfig = GetQueryHeaders().Aggregate(
            new StringBuilder(),
            (stringBuilder, h) =>
        {
            stringBuilder.AppendLine(h);
            stringBuilder.AppendLine();
            return stringBuilder;
        }).ToString();

        // Arrange: Create test LNQPad script.
        var linqScript = LinqScript.Create(
            $"{linqScriptName}.linq",
            queryConfig);

        // Act: Execute test LNQPad script.
        var (output, error, exitCode) =
            Runner.Execute(linqScript);

        // Assert.
        error.Should().BeNullOrWhiteSpace();
        exitCode.Should().Be(0);

        // Helpers.
        IEnumerable<string> GetQueryHeaders()
        {
            // Connection header.
            yield return ConnectionHeader.Get(
                "CsvLINQPadDriver",
                "CsvLINQPadDriver.CsvDataContextDriver",
                driverProperties,
                "System.Runtime.CompilerServices");

            // FluentAssertions helper.
            yield return
                @"string Reason([CallerLineNumber] int sourceLineNumber = 0) =>" +
                @" $""something went wrong at line #{sourceLineNumber}"";";

            // Test context.
            if (!string.IsNullOrWhiteSpace(context))
            {
                yield return $"var context = {context};";
            }
        }
    }

    private static IEnumerable<
        (string linqScriptName,
         string? context,
         ICsvDataContextDriverProperties driverProperties)> TestsData()
    {
        // Omitted for brevity.
    }
}

Tests can also be run in parallel:

[TestFixture]
public class LPRunTests
{
    [Test]
    [Parallelizable(ParallelScope.Children)]
    [TestCaseSource(nameof(ParallelizableTestsData))]
    public void Execute_ScriptWithDriverProperties_Success(
        (string linqScriptName,
         string? context,
         ICsvDataContextDriverProperties driverProperties,
         int index) testData)
    {
        // ...

        // Arrange: Create test LNQPad script.
        var linqScript = LinqScript.Create(
            $"{linqScriptName}.linq",
            queryConfig,
            $"{linqScriptName}_{testData.index}");

        // ...
    }

    private static IEnumerable<
        (string linqScriptName,
         string? context,
         ICsvDataContextDriverProperties driverProperties,
         int index)> TestsData()
    {
        // Omitted for brevity.
    }

    // Parallelized tests data.
    private static IEnumerable<
        (string linqScriptName,
         string? context,
         ICsvDataContextDriverProperties driverProperties,
         int index)> ParallelizableTestsData() =>
        TestsData().AugmentWithFileIndex(
            static testData => testData.linqScriptName,
            static (testData, index) => { testData.index = index; return testData; });
}

Known Issues

  • Tested with NUnit. Other test frameworks should work as well.

Authors

  • Ivan Ivon (ivan.ivon@gmail.com)

Credits

Tools

NuGet

License

MIT, see LICENSE file for details.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.1

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
8.6.6 155 11/5/2024
8.6.5 94 11/1/2024
8.6.4 183 10/6/2024
8.6.2 213 9/15/2024
8.6.1 99 8/5/2024
8.5.5 112 7/26/2024
8.5.4 94 7/23/2024
8.5.3 160 7/20/2024
8.5.2 118 7/18/2024
8.5.1 205 7/4/2024
8.4.11 161 6/19/2024
8.4.10 113 6/11/2024
8.4.9 131 6/5/2024
8.4.8 107 5/27/2024
8.4.7 138 5/24/2024
8.4.5 141 5/22/2024
8.4.4 142 5/17/2024
8.4.3 137 5/14/2024
8.4.2 189 5/10/2024
8.4.1 199 4/30/2024
8.3.7 158 4/18/2024
8.3.6 216 4/14/2024
8.3.5 207 4/7/2024
8.3.3 187 3/21/2024
8.3.2 232 3/13/2024
8.3.1 174 3/12/2024
8.2.4 147 2/17/2024
8.2.3 156 2/13/2024
8.2.2 196 1/23/2024
8.1.6 163 1/17/2024
8.1.3 232 1/3/2024
8.1.2 210 12/27/2023
8.1.1 178 12/22/2023
8.0.18 284 12/5/2023
8.0.17 230 11/26/2023
8.0.16 249 11/25/2023
8.0.15 189 11/24/2023
8.0.14 213 11/22/2023
8.0.13 191 11/18/2023
8.0.12 199 11/17/2023
8.0.11 181 11/16/2023
8.0.10 210 11/15/2023
8.0.9 202 11/12/2023
7.8.10 146 2/14/2024
7.8.7 233 11/26/2023
7.8.6 353 9/14/2023
7.8.5 401 8/1/2023
7.8.4 315 7/13/2023
7.8.3 310 7/3/2023
7.8.2 295 6/16/2023
7.8.1 298 6/9/2023
7.7.15 282 5/31/2023
7.7.14 281 5/29/2023
7.7.13 275 5/23/2023
7.7.12 307 5/18/2023
7.7.11 332 5/10/2023
7.7.10 412 4/19/2023
7.7.9 410 4/4/2023
7.7.8 437 4/4/2023
7.7.7 489 3/21/2023
7.7.6 484 3/18/2023
7.7.4 404 3/13/2023
7.7.3 495 2/20/2023
7.7.2 423 2/13/2023
7.7.1 480 2/1/2023
7.6.6 577 1/5/2023
7.6.5 444 12/24/2022
7.6.4 480 12/7/2022
7.6.3 509 11/26/2022
7.6.2 476 11/16/2022
7.5.16 503 11/14/2022
7.5.15 504 11/13/2022
7.5.14 534 11/11/2022
7.5.13 500 11/10/2022
7.5.12 526 10/31/2022
7.5.11 568 10/30/2022
7.5.10 545 10/25/2022
7.5.9 537 10/9/2022
7.5.8 523 10/6/2022
7.5.7 539 10/3/2022
7.5.6 584 9/26/2022
7.5.5 592 9/23/2022
7.5.4 593 9/20/2022
7.5.3 586 9/16/2022
7.5.2 611 8/28/2022
7.5.1 624 8/26/2022
7.4.9.1 672 8/3/2022
7.4.8 648 7/31/2022
7.4.7 657 7/25/2022
7.4.6 676 7/19/2022
7.4.5 700 7/15/2022
7.4.4 707 7/6/2022
7.4.3 702 6/8/2022
7.4.2 694 5/11/2022
7.4.1 661 5/3/2022
7.3.9 676 4/19/2022
7.3.6 671 3/25/2022
7.3.5 642 3/17/2022
7.3.4 650 3/15/2022
7.3.2 597 2/23/2022
7.3.1 598 2/17/2022
6.14.11 514 9/1/2021
6.14.10 628 7/18/2021
6.13.14 506 5/10/2021
6.13.13 534 5/5/2021

LPRun 7.7.3