208 lines
6.1 KiB
C#
208 lines
6.1 KiB
C#
using System.IO;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using NUnit.Framework;
|
|
using System;
|
|
using TestInvoker;
|
|
|
|
namespace MatterHackers.MatterControl.Tests.Automation
|
|
{
|
|
[TestFixture, Category("MatterControl.UI.Automation")]
|
|
public class ExportGcodeFromExportWindow
|
|
{
|
|
[Test, ChildProcessTest]
|
|
public async Task ExportAsGcode()
|
|
{
|
|
await MatterControlUtilities.RunTest(testRunner =>
|
|
{
|
|
testRunner.WaitForFirstDraw()
|
|
.AddAndSelectPrinter("Airwolf 3D", "HD")
|
|
//Navigate to Downloads Library Provider
|
|
.NavigateToFolder("Queue Row Item Collection")
|
|
.InvokeLibraryAddDialog();
|
|
|
|
//Get parts to add
|
|
string rowItemPath = MatterControlUtilities.GetTestItemPath("Batman.stl");
|
|
testRunner.Delay()
|
|
.Type(MatterControlUtilities.GetTestItemPath("Batman.stl"))
|
|
.Delay()
|
|
.Type("{Enter}")
|
|
//Get test results
|
|
.ClickByName("Row Item Batman.stl")
|
|
.ClickByName("Print Library Overflow Menu")
|
|
.ClickByName("Export Menu Item")
|
|
.WaitForName("Export Item Window");
|
|
|
|
string gcodeOutputPath = MatterControlUtilities.PathToExportGcodeFolder;
|
|
Directory.CreateDirectory(gcodeOutputPath);
|
|
string fullPathToGcodeFile = Path.Combine(gcodeOutputPath, "Batman");
|
|
|
|
testRunner.ClickByName("Machine File (G-Code) Button")
|
|
.ClickByName("Export Button")
|
|
.Delay()
|
|
.Type(fullPathToGcodeFile)
|
|
.Type("{Enter}")
|
|
.Assert(() => File.Exists(fullPathToGcodeFile + ".gcode"), "Exported file not found");
|
|
|
|
// add an item to the bed, and export it to gcode
|
|
fullPathToGcodeFile = Path.Combine(gcodeOutputPath, "Cube");
|
|
testRunner.AddItemToBed()
|
|
.ClickByName("PrintPopupMenu")
|
|
.ClickByName("Export GCode Button")
|
|
.Type(fullPathToGcodeFile)
|
|
.Type("{Enter}")
|
|
.Assert(() => File.Exists(fullPathToGcodeFile + ".gcode"), "Exported file not found");
|
|
|
|
return Task.FromResult(0);
|
|
});
|
|
}
|
|
|
|
[Test, ChildProcessTest]
|
|
public async Task ExportDesignTabAsSTL()
|
|
{
|
|
await MatterControlUtilities.RunTest(testRunner =>
|
|
{
|
|
testRunner.WaitForFirstDraw();
|
|
|
|
// save from design tab
|
|
var gcodeOutputPath = MatterControlUtilities.PathToExportGcodeFolder;
|
|
var fullPathToGcodeFile = Path.Combine(gcodeOutputPath, "Cube2");
|
|
Directory.CreateDirectory(gcodeOutputPath);
|
|
testRunner.EnsureWelcomePageClosed()
|
|
.ClickByName("Create New")
|
|
.AddItemToBed()
|
|
.ClickByName("Bed Options Menu")
|
|
.ClickByName("Export Menu Item")
|
|
.WaitForName("Export Item Window");
|
|
|
|
testRunner.ClickByName("STL File Button")
|
|
.ClickByName("Export Button")
|
|
.Delay()
|
|
.Type(fullPathToGcodeFile)
|
|
.Type("{Enter}")
|
|
.WaitFor(() => File.Exists(fullPathToGcodeFile + ".stl"), 10);
|
|
|
|
testRunner.WaitFor(() => File.Exists(fullPathToGcodeFile + ".stl"), 10);
|
|
Assert.IsTrue(File.Exists(fullPathToGcodeFile + ".stl"), "Exported file not found");
|
|
|
|
return Task.FromResult(0);
|
|
});
|
|
}
|
|
|
|
[Test, ChildProcessTest]
|
|
public async Task ExportStreamG92HandlingTest()
|
|
{
|
|
await MatterControlUtilities.RunTest(testRunner =>
|
|
{
|
|
testRunner.WaitForFirstDraw();
|
|
|
|
testRunner.CloneAndSelectPrinter("No Retraction after Purge");
|
|
|
|
var printer = testRunner.FirstPrinter();
|
|
|
|
//Navigate to Downloads Library Provider
|
|
testRunner.NavigateToFolder("Queue Row Item Collection");
|
|
testRunner.InvokeLibraryAddDialog();
|
|
|
|
//Get parts to add
|
|
string rowItemPath = MatterControlUtilities.GetTestItemPath("Batman.stl");
|
|
testRunner.Delay()
|
|
.Type(MatterControlUtilities.GetTestItemPath("Batman.stl"))
|
|
.Delay()
|
|
.Type("{Enter}");
|
|
|
|
//Get test results
|
|
testRunner.ClickByName("Row Item Batman.stl")
|
|
.ClickByName("Print Library Overflow Menu")
|
|
.ClickByName("Export Menu Item")
|
|
.WaitForName("Export Item Window");
|
|
|
|
testRunner.ClickByName("Machine File (G-Code) Button")
|
|
.ClickByName("Export Button");
|
|
|
|
string gcodeOutputPath = MatterControlUtilities.PathToExportGcodeFolder;
|
|
|
|
Directory.CreateDirectory(gcodeOutputPath);
|
|
|
|
string fullPathToGcodeFile = Path.Combine(gcodeOutputPath, "Batman");
|
|
testRunner.Type(fullPathToGcodeFile);
|
|
testRunner.Type("{Enter}");
|
|
|
|
var filename = fullPathToGcodeFile + ".gcode";
|
|
testRunner.WaitFor(() => File.Exists(filename), 10)
|
|
.WaitFor(() => !IsFileLocked(filename), 1000)
|
|
.Delay(2);
|
|
|
|
// validate that the actual printer output has the right lines
|
|
var expectedLines = new string[]
|
|
{
|
|
"G28 ; home all axes",
|
|
"M280 P0 S160",
|
|
"G4 P400",
|
|
"M280 P0 S90",
|
|
"M109 S205",
|
|
"G1 X5 Y5 Z3.13 F1800",
|
|
"G92 E0 ; Purge line",
|
|
"G1 X5.83 Z3.04 E0.833 F900",
|
|
"G1 X6.67 Z2.96 E1.667",
|
|
"G1 X7.5 Z2.87 E2.5",
|
|
"G1 X8.33 Z2.79 E3.333",
|
|
"G1 X9.17 Z2.7 E4.167",
|
|
"G1 X10 Z2.62 E5",
|
|
"G92 E0 ; Purge line",
|
|
"G1 E-2 F2400",
|
|
"M75 ; start print timer",
|
|
};
|
|
|
|
var actualLines = File.ReadAllLines(filename);
|
|
ValidateLinesStartingWithFirstExpected(expectedLines, actualLines);
|
|
|
|
// make sure the file has the expected header
|
|
|
|
return Task.FromResult(0);
|
|
}, maxTimeToRun: 200);
|
|
}
|
|
|
|
private bool IsFileLocked(string file)
|
|
{
|
|
try
|
|
{
|
|
using (FileStream stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.None))
|
|
{
|
|
stream.Close();
|
|
}
|
|
}
|
|
catch (IOException)
|
|
{
|
|
//the file is unavailable because it is:
|
|
//still being written to
|
|
//or being processed by another thread
|
|
//or does not exist (has already been processed)
|
|
return true;
|
|
}
|
|
|
|
//file is not locked
|
|
return false;
|
|
}
|
|
|
|
private void ValidateLinesStartingWithFirstExpected(string[] expectedLines, string[] actualLines)
|
|
{
|
|
// search actual lines until we find the first expectedLine
|
|
for (int i = 0; i < actualLines.Length; i++)
|
|
{
|
|
if (actualLines[i] == expectedLines[0])
|
|
{
|
|
for (int j = 0; j < expectedLines.Length; j++)
|
|
{
|
|
Assert.AreEqual(expectedLines[j], actualLines[i + j], "All lines should match");
|
|
// Debug.WriteLine("\"" + actualLines[i + j] + "\",");
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
throw new Exception("Did not find the first expected line");
|
|
}
|
|
}
|
|
}
|