Friday, 31 March 2017

VB.NET - Validating InputBox

If you are working with the system that still uses InputBox control from Microsoft.VisualBasic then you may get a situation where the input needs to be validated. InputBox control does not allow any validation checks and in ideal case needs to be replaced with custom WinForms dialog box. This post will show a simple way of validating InputBox by creating InputBoxValidated function and using IStringValidator interface.

Public Class InputBoxValidated
    Public Function InputBoxValidated _
        (
        prompt As String,
        title As String,
        Optional stringValidator As IStringValidator = Nothing,
        Optional validationMessage As String = ""
        ) As String
        Dim value As String _
            = Microsoft.VisualBasic.Interaction.InputBox(prompt, title)

        ' If the cancel button wasn't pressed 
        ' And IStringValidator is passed with validation message
        If Not value = String.Empty AndAlso stringValidator IsNot Nothing _
            AndAlso Not String.IsNullOrEmpty(validationMessage) Then
            If Not stringValidator.Validate(value) Then
                MessageBox.Show(validationMessage, Application.ProductName)
                value = InputBoxValidated(
                    prompt, title, stringValidator, validationMessage)
            End If
        End If

        Return value
    End Function
End Class

As you can see InputBoxValidated function uses IStringValidator interface that can implement any kind of string validations and criteria.

Public Interface IStringValidator
    Function Validate(value As String) As Boolean
End Interface

Below is an example of StringValidator class that implements IStringValidator interface and makes use of StringValidator from System.Configuration.

Public Class StringValidator
    Implements IStringValidator

    Public Sub New(maxLength As Integer, invalidCharacters As String)
        Me.MaxLength = maxLength
        Me.InvalidCharacters = invalidCharacters
    End Sub

    Public Property MaxLength As Integer
    Public Property InvalidCharacters As String
    Public Function Validate(value As String) _
        As Boolean Implements IStringValidator.Validate
        Dim valid As Boolean = True

        Try
            Dim stringValidator As _
                New System.Configuration.StringValidator _
                    (0, MaxLength, InvalidCharacters)
            If stringValidator.CanValidate(value.GetType()) Then
                stringValidator.Validate(value)
            Else
                valid = False
            End If
        Catch ex As ArgumentException
            valid = False
        End Try

        Return valid
    End Function
End Class

References:





Monday, 30 January 2017

Creating self extracting zip EXE under Linux for windows

Recently, I had a need to create a self extracting zip archive, which will open on any windows machine. Because, I am using Linux, I did not want to go through the process of installing the windows with 7z on it just for a sake of creating that archive. I was expecting that the process will be not trivial, as some of internet resources show, but all turned out very simple. Peazip archiver available for Windows as well as Linux, which is able to create self extracting exe archive. I downloaded portable version for 64 bit machine and when creating a new archive you get an option to create self extracting file in a single volume or split by chosen size.



What I found, peazip creates small archives that extract under windows machine just fine. If you need to zip large amount of files say > 1 GB, I would suggest to create normal archive, which can span several files of set size and then use 7zip on windows computer to extract them.

References:


Monday, 5 December 2016

Reading appsettings.json in .Net Core Console Application under Linux

Recently I was looking at how to load and use appsettings.json file in .Net Core Console application. Many resources on .Net forums and sites were descripting use of appsettings.json file in ASP.NET Core web App, but very little described appsettings with .Net Core Console app. I managed to created sample .Net Core app with the minimum required libraries. Creation of this sample program I am going to describe here. Let's call our App "appsettings".
$mkdir appsettings
$cd appsettings
$dotnet new
$dotnet restore
Now create appsettings.json file:
{
    "AppSettings": {
        "Date": "1900-01-01"
    }
}
Date is the setting I am interested in loading from AppSettings section.

Edit project.json file to include "Microsoft.Extensions.Configuration.UserSecrets": "1.1.0" in dependencies section. This is the only extra library we need in order to use ConfigurationBuilder functions.
{
    "version": "1.0.0-*",
    "buildOptions": {
        "debugType": "portable",
        "emitEntryPoint": true,
        "outputName": "AppSettings"
    },
    "dependencies": {},
    "frameworks": {
        "netcoreapp1.0": {
            "dependencies": {
                "Microsoft.NETCore.App": {
                    "type": "platform",
                    "version": "1.1.0"
                },
                "Microsoft.Extensions.Configuration.UserSecrets": "1.1.0"
            },
            "imports": "dnxcore50"
        }
    }
}
Now lets edit the Program.cs file. We are going to load the Date setting and display it in Console. Don't forget to include "using Microsoft.Extensions.Configuration;"
using System;
using System.IO;
using Microsoft.Extensions.Configuration;

namespace ConsoleApplication
{
    public class Program
    {
        public static string AppSettingsFile = "appsettings.json";
        public static string AppSettingsSection = "AppSettings";
        public static string DateSetting = "Date";

        public static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile(Program.AppSettingsFile, optional: true, 
                             reloadOnChange: true);
            
            var config = builder.Build();
            var appSettings = config.GetSection(Program.AppSettingsSection);
            string dateString = appSettings[Program.DateSetting];
            Console.WriteLine("Date:" + dateString);
        }
    }
}
That is pretty much all. Now let's build and run it.
$dotnet build
$dotnet run
Date:1900-01-01

Monday, 14 November 2016

xUnit Theory test ClassData with complex type

xUnit.net is a powerful, free, open source, unit testing tool for the .NET Framework. xUnit uses different notation to NUnit or MSUnit to specify test with parameters. Here I am going to show how to use Theory ClassData with complex type.

I have a sample class Plant, which has function 'bool IsEqual(Plant plant);'. We will create a Theory test for it.
[Theory] [ClassData(typeof(IsEqualTestData))] public void IsEqual(Plant plant1, Plant plant2, bool expectedResult) { Assert.Equal(expectedResult, plant1.IsEqual(plant2)); }
Class IsEqualTestData is a ClassData used with complex type Plant. It generates a list of arrays of 3 objects Plant1, Plant2, and ExpectedResult boolean.
private class IsEqualTestData : IEnumerable<object[]> { private readonly List<object[]> _data = new List<object[]> { new object[] { new Plant() { Name = PlantTester.PlantName1, Description = PlantTester.PlantDescription1 }, new Plant() { Name = PlantTester.PlantName2, Description = PlantTester.PlantDescription2 }, false }, new object[] { new Plant() { Name = PlantTester.PlantName1 }, new Plant() { Name = PlantTester.PlantName1 }, true }, new object[] { new Plant() { Name = PlantTester.PlantName1, Description = PlantTester.PlantDescription1 }, new Plant() { Name = PlantTester.PlantName2, Description = PlantTester.PlantDescription1 }, true } }; public IEnumerator<object[]> GetEnumerator() { return _data.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
When running in xUnit it will report result of running each entry in the test.

If you are using Visual Studio you can download snippet file from github repository.

Reference:

xUnit_ClassData.snippet
Using dotnet watch test for continuous testing with .NET Core and XUnit.net - Scott Hanselman

Tuesday, 5 July 2016

.Net Core 1.0 Released! Or installing .Net Core on Debian

This was a great news to me that .Net Core 1.0 was released. I already was trying .Net Core RC2 on my Debian 8.x so I prepared to go through the installation process of new release. Surprisingly installation of .Net Core 1.0 described in Install for Debian 8 on Microsoft site was very smooth in comparison to beta versions. All I had to do is to clean up my previous install from ~/.dotnet go through the instructions on install page and "Hello World!" programs runs. Very pleased to see that improvement.

So here I am going to provide some links to what to do next once you get your install done too.

References: