2016-12-05 15:18:43 -08:00
using System ;
2015-07-29 17:55:17 -07:00
using System.Collections.Generic ;
using System.Globalization ;
2016-12-05 15:18:43 -08:00
using System.IO ;
using System.Linq ;
using MatterHackers.Agg ;
2017-08-20 02:34:39 -07:00
using MatterHackers.Agg.Platform ;
2015-07-29 17:55:17 -07:00
using MatterHackers.MatterControl.SlicerConfiguration ;
2016-12-05 15:18:43 -08:00
using MatterHackers.MatterControl.Tests.Automation ;
using NUnit.Framework ;
2015-07-29 17:55:17 -07:00
namespace MatterControl.Tests.MatterControl
{
2016-01-05 17:18:18 -08:00
[TestFixture]
public class PrinterConfigurationTests
{
2017-11-15 13:27:12 -08:00
[Test, Category("PrinterConfigurationFiles"), Ignore("Not Finished/previously ignored")]
2016-01-05 17:18:18 -08:00
public void PrinterConfigTests ( )
{
2016-12-05 15:18:43 -08:00
string staticDataPath = TestContext . CurrentContext . ResolveProjectPath ( 5 , "MatterControl" , "StaticData" ) ;
2017-08-20 02:34:39 -07:00
AggContext . StaticData = new FileSystemStaticData ( staticDataPath ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:37:07 -08:00
var profilesDirectory = new DirectoryInfo ( Path . Combine ( staticDataPath , "Profiles" ) ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
foreach ( FileInfo file in profilesDirectory . GetFiles ( "*.printer" , SearchOption . AllDirectories ) )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
var printerSettings = PrinterSettings . LoadFile ( file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:57:35 -08:00
// Assert that no UserLayer values exist in production .printer files
2016-12-05 16:10:20 -08:00
Assert . AreEqual ( 0 , printerSettings . UserLayer . Keys . Count , ".printer files should not contain UserLayer values" ) ;
2016-12-05 15:57:35 -08:00
2016-12-05 15:18:43 -08:00
var layersToInspect = new List < PrinterSettingsLayer > ( ) ;
layersToInspect . Add ( printerSettings . OemLayer ) ;
layersToInspect . AddRange ( printerSettings . MaterialLayers ) ;
layersToInspect . AddRange ( printerSettings . QualityLayers ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
// Validate each PrinterSettingLayer in the .printer file
foreach ( var layer in layersToInspect . Where ( l = > l . Keys . Any ( ) ) )
{
firstLayerSpeedEqualsAcceptableValue ( printerSettings , layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
firstLayerHeightLessThanNozzleDiameter ( printerSettings , layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
layerHeightLessThanNozzleDiameter ( printerSettings , layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
firstLayerExtrusionWidthAcceptableValue ( printerSettings , layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
firstLayerExtrusionWidthNotZero ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
bedSizeXYSeparatedByComma ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
printCenterFormatSeparatedByComma ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
testRetractLengthLessThanTwenty ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
testExtruderCountGreaterThanZero ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
minimumFanSpeedLessThanOrEqualToOneHundred ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
maxFanSpeedNotGreaterThanOneHundred ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
noCurlyBracketsInStartGcode ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
noCurlyBracketsInEndGcode ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
testBottomSolidLayersOneMM ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
testFirstLayerTempNotInStartGcode ( layer , file . FullName ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
testFirstLayerBedTemperatureNotInStartGcode ( layer , file . FullName ) ;
}
2016-01-05 17:18:18 -08:00
}
}
2016-12-05 15:18:43 -08:00
public void firstLayerSpeedEqualsAcceptableValue ( PrinterSettings settings , PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string firstLayerSpeedString ;
if ( ! layer . TryGetValue ( SettingsKey . first_layer_speed , out firstLayerSpeedString ) )
{
return ;
}
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
double firstLayerSpeed ;
2016-01-05 17:18:18 -08:00
if ( firstLayerSpeedString . Contains ( "%" ) )
{
2019-01-06 19:32:46 -08:00
string infillSpeedString = settings . GetValue ( SettingsKey . infill_speed ) ;
2016-01-05 17:18:18 -08:00
double infillSpeed = double . Parse ( infillSpeedString ) ;
firstLayerSpeedString = firstLayerSpeedString . Replace ( "%" , "" ) ;
double FirstLayerSpeedPercent = double . Parse ( firstLayerSpeedString ) ;
firstLayerSpeed = FirstLayerSpeedPercent * infillSpeed / 100.0 ;
}
else
{
firstLayerSpeed = double . Parse ( firstLayerSpeedString ) ;
}
2016-12-05 15:18:43 -08:00
Assert . Greater ( firstLayerSpeed , 5 , "Unexpected firstLayerSpeedEqualsAcceptableValue value: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void firstLayerHeightLessThanNozzleDiameter ( PrinterSettings printerSettings , PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string firstLayerHeight ;
if ( ! layer . TryGetValue ( SettingsKey . first_layer_height , out firstLayerHeight ) )
{
return ;
}
2016-01-05 17:18:18 -08:00
float convertedFirstLayerHeightValue ;
if ( firstLayerHeight . Contains ( "%" ) )
{
string reFormatLayerHeight = firstLayerHeight . Replace ( "%" , " " ) ;
convertedFirstLayerHeightValue = float . Parse ( reFormatLayerHeight ) / 100 ;
}
else
{
convertedFirstLayerHeightValue = float . Parse ( firstLayerHeight ) ;
}
2016-12-05 15:18:43 -08:00
string nozzleDiameter = printerSettings . GetValue ( SettingsKey . nozzle_diameter ) ;
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
Assert . LessOrEqual ( convertedFirstLayerHeightValue , float . Parse ( nozzleDiameter ) , "Unexpected firstLayerHeightLessThanNozzleDiameter value: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void firstLayerExtrusionWidthAcceptableValue ( PrinterSettings printerSettings , PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string firstLayerExtrusionWidth ;
if ( ! layer . TryGetValue ( SettingsKey . first_layer_extrusion_width , out firstLayerExtrusionWidth ) )
{
return ;
}
2016-01-05 17:18:18 -08:00
float convertedFirstLayerExtrusionWidth ;
2016-12-05 15:18:43 -08:00
string nozzleDiameter = printerSettings . GetValue ( SettingsKey . nozzle_diameter ) ;
2016-01-05 17:18:18 -08:00
float acceptableValue = float . Parse ( nozzleDiameter ) * 4 ;
if ( firstLayerExtrusionWidth . Contains ( "%" ) )
{
string reformatFirstLayerExtrusionWidth = firstLayerExtrusionWidth . Replace ( "%" , " " ) ;
convertedFirstLayerExtrusionWidth = float . Parse ( reformatFirstLayerExtrusionWidth ) / 100 ;
}
else
{
convertedFirstLayerExtrusionWidth = float . Parse ( firstLayerExtrusionWidth ) ;
}
2016-12-05 15:18:43 -08:00
Assert . LessOrEqual ( convertedFirstLayerExtrusionWidth , acceptableValue , "Unexpected firstLayerExtrusionWidthAcceptableValue value: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void firstLayerExtrusionWidthNotZero ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string firstLayerExtrusionWidth ;
if ( ! layer . TryGetValue ( SettingsKey . first_layer_extrusion_width , out firstLayerExtrusionWidth ) )
{
return ;
}
2016-01-05 17:18:18 -08:00
float convertedFirstLayerExtrusionWidth ;
if ( firstLayerExtrusionWidth . Contains ( "%" ) )
{
string reformatFirstLayerExtrusionWidth = firstLayerExtrusionWidth . Replace ( "%" , " " ) ;
convertedFirstLayerExtrusionWidth = float . Parse ( reformatFirstLayerExtrusionWidth ) ;
}
else
{
convertedFirstLayerExtrusionWidth = float . Parse ( firstLayerExtrusionWidth ) ;
}
2016-12-05 15:18:43 -08:00
Assert . AreNotEqual ( 0 , convertedFirstLayerExtrusionWidth , "Unexpected firstLayerExtrusionWidthNotZero value: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void layerHeightLessThanNozzleDiameter ( PrinterSettings printerSettings , PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string layerHeight ;
if ( ! layer . TryGetValue ( SettingsKey . layer_height , out layerHeight ) )
{
return ;
}
2016-01-05 17:18:18 -08:00
float convertedLayerHeight = float . Parse ( layerHeight ) ;
2016-12-05 15:18:43 -08:00
string nozzleDiameter = printerSettings . GetValue ( SettingsKey . nozzle_diameter ) ;
2016-01-05 17:18:18 -08:00
float convertedNozzleDiameterValue = float . Parse ( nozzleDiameter ) ;
2016-12-05 15:18:43 -08:00
Assert . LessOrEqual ( convertedLayerHeight , convertedNozzleDiameterValue , "Unexpected layerHeightLessThanNozzleDiameter value: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void bedSizeXYSeparatedByComma ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
if ( ! layer . TryGetValue ( SettingsKey . bed_size , out settingValue ) )
{
return ;
}
2016-01-05 17:18:18 -08:00
string [ ] settingValueToTest = settingValue . Split ( new [ ] { ',' } , StringSplitOptions . RemoveEmptyEntries ) ;
2016-12-05 15:18:43 -08:00
Assert . AreEqual ( 2 , settingValueToTest . Length , "bed_size should have two values separated by a comma: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void printCenterFormatSeparatedByComma ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
if ( ! layer . TryGetValue ( SettingsKey . print_center , out settingValue ) )
{
return ;
}
2016-01-05 17:18:18 -08:00
string [ ] settingValueToTest = settingValue . Split ( new [ ] { ',' } , StringSplitOptions . RemoveEmptyEntries ) ;
2016-12-05 15:18:43 -08:00
Assert . AreEqual ( 2 , settingValueToTest . Length , "print_center should have two values separated by a comma: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void testRetractLengthLessThanTwenty ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2019-01-07 09:18:51 -08:00
if ( ! layer . TryGetValue ( SettingsKey . retract_length , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2016-01-05 17:18:18 -08:00
2016-12-05 15:18:43 -08:00
Assert . Less ( float . Parse ( settingValue , CultureInfo . InvariantCulture . NumberFormat ) , 20 , "retract_length should be less than 20: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2016-12-05 15:18:43 -08:00
public void testExtruderCountGreaterThanZero ( PrinterSettingsLayer layer , string sourceFile )
{
string settingValue ;
if ( ! layer . TryGetValue ( "extruder_count" , out settingValue ) )
{
return ;
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
Assert . Greater ( int . Parse ( settingValue ) , 0 , "extruder_count should be greater than zero: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
public void minimumFanSpeedLessThanOrEqualToOneHundred ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2018-10-26 14:51:04 -07:00
if ( ! layer . TryGetValue ( SettingsKey . min_fan_speed , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
Assert . LessOrEqual ( int . Parse ( settingValue ) , 100 , "min_fan_speed should be less than or equal to 100: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
public void maxFanSpeedNotGreaterThanOneHundred ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2018-10-26 14:51:04 -07:00
if ( ! layer . TryGetValue ( SettingsKey . max_fan_speed , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
Assert . LessOrEqual ( int . Parse ( settingValue ) , 100 , "max_fan_speed should be less than or equal to 100: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
public void noCurlyBracketsInStartGcode ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2017-06-29 09:47:34 -07:00
if ( ! layer . TryGetValue ( SettingsKey . start_gcode , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
Assert . IsFalse ( settingValue . Contains ( "{" ) , "start_gcode should not contain braces: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
public void noCurlyBracketsInEndGcode ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2017-06-29 09:47:34 -07:00
if ( ! layer . TryGetValue ( SettingsKey . end_gcode , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
Assert . False ( settingValue . Contains ( "{" ) , "end_gcode should not contain braces: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
public void testBottomSolidLayersOneMM ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2019-01-07 09:18:51 -08:00
if ( ! layer . TryGetValue ( SettingsKey . bottom_solid_layers , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
Assert . AreEqual ( "1mm" , settingValue , "bottom_solid_layers should be 1mm: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
public void testFirstLayerTempNotInStartGcode ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2017-06-29 09:47:34 -07:00
if ( ! layer . TryGetValue ( SettingsKey . start_gcode , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2015-07-29 17:55:17 -07:00
2019-01-11 14:39:40 -08:00
Assert . False ( settingValue . Contains ( SettingsKey . first_layer_temperature ) , "start_gcode should not contain first_layer_temperature: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
2015-07-29 17:55:17 -07:00
2016-12-05 15:18:43 -08:00
public void testFirstLayerBedTemperatureNotInStartGcode ( PrinterSettingsLayer layer , string sourceFile )
2016-01-05 17:18:18 -08:00
{
2016-12-05 15:18:43 -08:00
string settingValue ;
2017-06-29 09:47:34 -07:00
if ( ! layer . TryGetValue ( SettingsKey . start_gcode , out settingValue ) )
2016-12-05 15:18:43 -08:00
{
return ;
}
2019-01-11 14:39:40 -08:00
Assert . False ( settingValue . Contains ( SettingsKey . first_layer_bed_temperature ) , "start_gcode should not contain first_layer_bed_temperature: " + sourceFile ) ;
2016-01-05 17:18:18 -08:00
}
}
2015-07-29 17:55:17 -07:00
}