Skip to content

Commit d577b2e

Browse files
authored
Merge pull request #143 from gdeswardt/feature/change-selector-access
Feature/change selector accessors
2 parents 4e0d475 + b5f0783 commit d577b2e

18 files changed

Lines changed: 93 additions & 21 deletions

src/ExCSS.Tests/ExCSS.Tests.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net5.0</TargetFramework>
4+
<TargetFramework>net7.0</TargetFramework>
55
<AssemblyName>ExCSS.Tests</AssemblyName>
66
<PackageId>ExCSS.Tests</PackageId>
77
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
@@ -30,4 +30,8 @@
3030
<Folder Include="Properties\" />
3131
</ItemGroup>
3232

33+
<ItemGroup>
34+
<EmbeddedResource Include="bootstrap.css" />
35+
</ItemGroup>
36+
3337
</Project>

src/ExCSS.Tests/Selectors.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using System.IO;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using Xunit;
5+
6+
namespace ExCSS.Tests;
7+
8+
public class SelectorsTests
9+
{
10+
[Fact]
11+
public async Task FindAllStyleRulesForAnElement()
12+
{
13+
// Arrange
14+
var sheet = await ParseBootstrapAsync();
15+
16+
// Act
17+
var list = sheet.StyleRules
18+
.Where(r =>
19+
r.Selector is SimpleSelector { Text: "input" }
20+
|| (r.Selector is CompoundSelector selector && selector.First() is SimpleSelector { Text: "input" })
21+
);
22+
23+
// Assert
24+
Assert.Equal(6, list.Count());
25+
}
26+
27+
[Fact]
28+
public async Task FindAllStyleRulesElementsWithMoreThanTwoCompoundSelectors()
29+
{
30+
// Arrange
31+
var sheet = await ParseBootstrapAsync();
32+
33+
// Act
34+
var list = sheet.StyleRules
35+
.Where(r => (r.Selector as CompoundSelector)?.Length > 2);
36+
37+
// Assert
38+
Assert.Equal(2, list.Count());
39+
}
40+
41+
[Fact]
42+
public async Task FindAllStyleRulesWithCompoundSelector()
43+
{
44+
// Arrange
45+
var sheet = await ParseBootstrapAsync();
46+
47+
// Act
48+
var list = sheet.StyleRules
49+
.Where(r => r.Selector is CompoundSelector selector && selector.Last().Text.StartsWith("["));
50+
51+
// Assert
52+
Assert.Equal(7, list.Count());
53+
}
54+
55+
private async Task<Stylesheet> ParseBootstrapAsync()
56+
{
57+
await using var stream = GetStream("bootstrap.css");
58+
var parser = new StylesheetParser();
59+
return await parser.ParseAsync(stream);
60+
}
61+
62+
private Stream GetStream(string fileName)
63+
{
64+
var fullyQualifiedName = $"{GetType().Namespace}.{fileName}";
65+
return GetType().Assembly.GetManifestResourceStream(fullyQualifiedName);
66+
}
67+
}

src/ExCSS.Tests/Sheet.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace ExCSS.Tests
1+
using System;
2+
3+
namespace ExCSS.Tests
24
{
35
using ExCSS;
46
using Xunit;
@@ -981,7 +983,7 @@ public void CssParseMsViewPortWithUnknownRules()
981983
var css = "@-ms-viewport{width:device-width} .dsip { display: block; }";
982984
var doc = ParseStyleSheet(css, true, true, true, true);
983985
var result = doc.ToCss();
984-
Assert.Equal("@-ms-viewport{width:device-width}\r\n.dsip { display: block }", result);
986+
Assert.Equal($"@-ms-viewport{{width:device-width}}{Environment.NewLine}.dsip {{ display: block }}", result);
985987
}
986988

987989
[Fact]
@@ -990,7 +992,7 @@ public void CssParseMediaAndMsViewPortWithoutOptions()
990992
var css = "@media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .dsip { display: block; }";
991993
var doc = ParseStyleSheet(css);
992994
var result = doc.ToCss();
993-
Assert.Equal("@media screen and (max-width: 400px) { }\r\n.dsip { display: block }", result);
995+
Assert.Equal($"@media screen and (max-width: 400px) {{ }}{Environment.NewLine}.dsip {{ display: block }}", result);
994996
}
995997

996998
[Fact]
@@ -999,7 +1001,7 @@ public void CssParseMediaAndMsViewPortWithUnknownRules()
9991001
var css = "@media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } } .dsip { display: block; }";
10001002
var doc = ParseStyleSheet(css, true, true, true, true);
10011003
var result = doc.ToCss();
1002-
Assert.Equal("@media screen and (max-width: 400px) { @-ms-viewport { width: 320px; } }\r\n.dsip { display: block }", result);
1004+
Assert.Equal($"@media screen and (max-width: 400px) {{ @-ms-viewport {{ width: 320px; }} }}{Environment.NewLine}.dsip {{ display: block }}", result);
10031005
}
10041006

10051007
[Fact]

src/ExCSS/ExCSS.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<LangVersion>9.0</LangVersion>
5-
<TargetFrameworks>net5.0;netstandard2.0;netcoreapp3.1;net452</TargetFrameworks>
5+
<TargetFrameworks>net7.0;net6.0;netstandard2.1;netstandard2.0;netcoreapp3.1;net452</TargetFrameworks>
66
<AssemblyName>ExCSS</AssemblyName>
77
<PackageId>ExCSS</PackageId>
88
<Title>ExCSS .NET Stylesheet Parser</Title>

src/ExCSS/Model/Combinator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace ExCSS
22
{
3-
internal abstract class Combinator
3+
public abstract class Combinator
44
{
55
public static readonly Combinator Child = new ChildCombinator();
66
public static readonly Combinator Deep = new DeepCombinator();

src/ExCSS/Selectors/ChildSelector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace ExCSS
44
{
5-
internal abstract class ChildSelector : StylesheetNode, ISelector
5+
public abstract class ChildSelector : StylesheetNode, ISelector
66
{
77
private readonly string _name;
88
protected int Step;

src/ExCSS/Selectors/ComplexSelector.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace ExCSS
55
{
6-
internal sealed class ComplexSelector : StylesheetNode, ISelector
6+
public sealed class ComplexSelector : StylesheetNode, ISelector
77
{
88
private readonly List<CombinatorSelector> _selectors;
99

@@ -18,7 +18,6 @@ private struct CombinatorSelector
1818
public ISelector Selector;
1919
}
2020

21-
2221
public string Text => this.ToCss();
2322
public int Length => _selectors.Count;
2423
public bool IsReady { get; private set; }

src/ExCSS/Selectors/CompoundSelector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace ExCSS
44
{
5-
internal sealed class CompoundSelector : Selectors, ISelector
5+
public sealed class CompoundSelector : Selectors, ISelector
66
{
77
public override void ToCss(TextWriter writer, IStyleFormatter formatter)
88
{

src/ExCSS/Selectors/FirstChildSelector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
namespace ExCSS
22

33
{
4-
internal sealed class FirstChildSelector : ChildSelector
4+
public sealed class FirstChildSelector : ChildSelector
55
{
66
public FirstChildSelector()
77
: base(PseudoClassNames.NthChild)

src/ExCSS/Selectors/FirstColumnSelector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace ExCSS
22
{
3-
internal sealed class FirstColumnSelector : ChildSelector
3+
public sealed class FirstColumnSelector : ChildSelector
44
{
55
public FirstColumnSelector()
66
: base(PseudoClassNames.NthColumn)

0 commit comments

Comments
 (0)