Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
7abf66c
REVIT-238057: Add OOTB D4R sample tests with SetupUnzip
Fusneica-FlorentinCristian Apr 6, 2026
0ee962e
Merge remote-tracking branch 'origin/master' into fusneif/REVIT-23805…
Fusneica-FlorentinCristian Apr 23, 2026
bddc280
REVIT-238057: Address PR review — refactor OOTB_D4R_Tests
Fusneica-FlorentinCristian Apr 23, 2026
7288c0c
REVIT-238057: Update .gitignore to include packages directory
Fusneica-FlorentinCristian Apr 23, 2026
6609d64
Add logs directory to .gitignore to prevent tracking log files
Fusneica-FlorentinCristian Apr 23, 2026
c2df5c8
REVIT-238057: Add explicit using System for InvalidOperationException
Fusneica-FlorentinCristian Apr 23, 2026
b5eb9d0
REVIT-238057: Update OOTB D4R sample tests to use correct models per …
Fusneica-FlorentinCristian Apr 27, 2026
ce36648
Merge remote-tracking branch 'origin/master' into fusneif/REVIT-23805…
Fusneica-FlorentinCristian May 5, 2026
a50d36f
Address PR feedback: rename class, add node warning check, extract to…
Fusneica-FlorentinCristian May 6, 2026
1a90684
Fix test model paths to use models available in repo
Fusneica-FlorentinCristian May 6, 2026
47393d0
Use version-keyed temp cache with atomic extraction
Fusneica-FlorentinCristian May 6, 2026
6e76992
Add cache fallback when zip is absent
Fusneica-FlorentinCristian May 6, 2026
db46fcb
Comment out zip extraction priorities, keep for future use
Fusneica-FlorentinCristian May 6, 2026
d4b045b
Rename SetupUnzip to ResolveSamplePath, add locale probe, sort diagno…
Fusneica-FlorentinCristian May 6, 2026
7c2d132
Fix double semicolon, add comment clarifying SamplesPath distinction
Fusneica-FlorentinCristian May 6, 2026
81dcef8
Add graph-loaded assertion, clarify assembly location pattern
Fusneica-FlorentinCristian May 6, 2026
2609aac
Improve assertion diagnostics: show node messages and connector details
Fusneica-FlorentinCristian May 8, 2026
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@ pip-log.txt

#Mr Developer
.mr.developer.cfg

packages/*
src/AssemblySharedInfoGenerator/AssemblySharedInfo.cs
test/Libraries/RevitIntegrationTests/RevitTestConfiguration.xml
test/**/*.txt
Expand All @@ -225,3 +227,4 @@ test/SystemInJson

# Icon resources
/src/DynamoRevitIcons/*.resources
logs/*
185 changes: 185 additions & 0 deletions test/Libraries/RevitIntegrationTests/OOTB_D4R_SampleTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
using NUnit.Framework;
using RevitTestServices;
using RTF.Framework;

namespace RevitSystemTests
{
/// <summary>
/// Tests for the Out-of-the-Box (OOTB) D4R sample scripts shipped as part of the
/// revit-d4r-content-samples artifact.
///
/// The .dyn files are resolved at runtime via <see cref="SetupUnzip"/> which checks,
/// in order:
/// 1. An already-extracted D4RSamples folder next to the installed samples directory.
/// 2. A revit-d4r-content-samples-*-net10.zip in the installed samples directory.
/// 3. The already-deployed samples at DynamoForRevit\samples\en-US\Revit\.
/// </summary>
[TestFixture]
class OOTB_D4R_Tests : RevitSystemTestBase
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
Outdated
{
private static string SetupUnzip(string scriptFileName)
{
string assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.

// When deployed to Revit:
// assemblyDir = DynamoForRevit\Revit\
// parentDir = DynamoForRevit\
string parentDir = Path.GetDirectoryName(assemblyDir);

string samplesFolder = Path.Combine(parentDir, "samples");
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
string extractedSamplesPath = Path.Combine(samplesFolder, "D4RSamples");
string installedSamplesPath = Path.Combine(samplesFolder, @"en-US\Revit");

Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
// Priority 1: zip was already extracted from a previous test run
if (Directory.Exists(extractedSamplesPath))
{
var resolved = Path.Combine(extractedSamplesPath, @"Samples\en-US\Revit", scriptFileName);
if (File.Exists(resolved))
return resolved;
}

Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
// Priority 2: zip file is present — extract on first use
if (Directory.Exists(samplesFolder))
{
var zipFiles = Directory.GetFiles(
samplesFolder,
"revit-d4r-content-samples-*-net10.zip")
.OrderBy(path => path)
.ToArray();

if (zipFiles.Length > 1)
{
var matches = zipFiles.Select(path => $"\n {path}");
throw new InvalidOperationException(
$"Multiple revit-d4r-content-samples archives were found in '{samplesFolder}', " +
$"so the OOTB D4R sample source is ambiguous. Ensure exactly one matching zip is present." +
$"{string.Concat(matches)}");
}

if (zipFiles.Length == 1)
{
ZipFile.ExtractToDirectory(zipFiles[0], extractedSamplesPath);
var resolved = Path.Combine(extractedSamplesPath, @"Samples\en-US\Revit", scriptFileName);
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
Outdated
if (File.Exists(resolved))
return resolved;
}
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
Outdated
}

// Priority 3: already-deployed samples (standard Revit install)
if (Directory.Exists(installedSamplesPath))
{
var resolved = Path.Combine(installedSamplesPath, scriptFileName);
if (File.Exists(resolved))
return resolved;
}

// Provide a useful diagnostic message to help locate the issue
if (Directory.Exists(samplesFolder))
{
var entries = Directory.EnumerateFileSystemEntries(samplesFolder)
.Select(e => $"\n {e}");
throw new FileNotFoundException(
$"Cannot locate OOTB D4R sample script '{scriptFileName}'.\n" +
$"Checked samples folder: {samplesFolder}\n" +
$"Contents:{string.Concat(entries)}");
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
}
else
{
var parentEntries = Directory.Exists(parentDir)
? Directory.EnumerateDirectories(parentDir).Select(e => $"\n {e}")
: Enumerable.Empty<string>();
throw new FileNotFoundException(
$"Cannot locate OOTB D4R sample script '{scriptFileName}'.\n" +
$"Expected samples folder not found: {samplesFolder}\n" +
$"Parent dir contents:{string.Concat(parentEntries)}");
}
}

private void OpenAndRunSample(string scriptFileName)
{
string samplePath = SetupUnzip(scriptFileName);
string testPath = Path.GetFullPath(samplePath);

ViewModel.OpenCommand.Execute(testPath);

AssertNoDummyNodes();

RunCurrentModel();
}

[Test, Category("SmokeTests")]
[TestModel(@".\empty.rfa")]
public void Revit_Geometry_Creation_Points()
{
OpenAndRunSample("Revit Geometry Creation Points.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\empty.rfa")]
public void Revit_Geometry_Creation_Curves()
{
OpenAndRunSample("Revit Geometry Creation Curves.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\empty.rfa")]
public void Revit_Geometry_Creation_Solids()
{
OpenAndRunSample("Revit Geometry Creation Solids.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\empty.rfa")]
public void Revit_Geometry_Creation_Surfaces()
{
OpenAndRunSample("Revit Geometry Creation Surfaces.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\Samples\DynamoSample_2021.rvt")]
public void Revit_Adaptive_Component_Placement()
{
OpenAndRunSample("Revit Adaptive Component Placement.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\Samples\DynamoSample_2021.rvt")]
public void Revit_Color()
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
{
OpenAndRunSample("Revit Color.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\Samples\DynamoSample_2021.rvt")]
public void Revit_Floors_and_Framing()
{
OpenAndRunSample("Revit Floors and Framing.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\Samples\DynamoSample_2021.rvt")]
public void Revit_Import_Solid()
{
OpenAndRunSample("Revit Import Solid.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\Samples\DynamoSample_2021.rvt")]
public void Revit_Place_Families_By_Level_Set_Parameters()
{
OpenAndRunSample("Revit Place Families By Level Set Parameters.dyn");
}

[Test, Category("SmokeTests")]
[TestModel(@".\Samples\DynamoSample_2021.rvt")]
public void Revit_Structural_Framing()
Comment thread
Fusneica-FlorentinCristian marked this conversation as resolved.
{
OpenAndRunSample("Revit Structural Framing.dyn");
}
}
}