File: StaticWebAssets\Globbing\PathTokenizerTest.cs
Web Access
Project: ..\..\..\test\Microsoft.NET.Sdk.StaticWebAssets.Tests\Microsoft.NET.Sdk.StaticWebAssets.Tests.csproj (Microsoft.NET.Sdk.StaticWebAssets.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Microsoft.AspNetCore.StaticWebAssets.Tasks.Test;
 
public class PathTokenizerTest
{
    [Fact]
    public void RootSeparator_ProducesEmptySegment()
    {
        var path = "/a/b/c";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("a", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void NonRootSeparator_ProducesInitialSegment()
    {
        var path = "a/b/c";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("a", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void NonRootSeparator_MatchesMultipleCharacters()
    {
        var path = "aa/b/c";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void NonRootSeparator_HandlesConsecutivePathSeparators()
    {
        var path = "aa//b/c";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void NonRootSeparator_HandlesFinalPathSeparator()
    {
        var path = "aa/b/c/";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void NonRootSeparator_HandlesAlternativePathSeparators()
    {
        var path = "aa\\b\\c\\";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void NonRootSeparator_HandlesMixedPathSeparators()
    {
        var path = "aa/b\\c/";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void Ignores_EmpySegments()
    {
        var path = "aa//b//c";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void Ignores_DotSegments()
    {
        var path = "./aa/./b/./c/.";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
 
    [Fact]
    public void Ignores_DotDotSegments()
    {
        var path = "../aa/../b/../c/..";
        var tokenizer = new PathTokenizer(path.AsMemory().Span);
        var segments = new List<PathTokenizer.Segment>();
        var collection = tokenizer.Fill(segments);
        Assert.Equal("aa", collection[0]);
        Assert.Equal("b", collection[1]);
        Assert.Equal("c", collection[2]);
    }
}