Tests for new DRC features (square, new attiribute tests)

This commit is contained in:
Matthias Koefferlein
2021-01-13 13:35:37 +01:00
parent a8f08bffac
commit c5859cd957
15 changed files with 160 additions and 23 deletions
+1 -1
View File
@@ -862,7 +862,7 @@ gsi::EnumIn<db::CompoundRegionOperationNode, db::RegionBBoxFilter::parameter_typ
"This enum has been introduced in version 0.27."
);
gsi::EnumIn<db::CompoundRegionOperationNode, db::RegionRatioFilter::parameter_type> decl_dbRegionRatioFilter_ParameterType ("db", "ParameterType",
gsi::EnumIn<db::CompoundRegionOperationNode, db::RegionRatioFilter::parameter_type> decl_dbRegionRatioFilter_ParameterType ("db", "RatioParameterType",
gsi::enum_const ("AreaRatio", db::RegionRatioFilter::AreaRatio,
"@brief Measures the area ratio (bounding box area / polygon area)\n"
) +
+53 -16
View File
@@ -399,7 +399,7 @@ CODE
# The plain function is equivalent to "primary.bbox_aspect_ratio".
def bbox_aspect_ratio
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RegionRatioFilter::AspectRatio, self)
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RatioParameterType::AspectRatio, self)
end
# %DRC%
@@ -430,7 +430,7 @@ CODE
# The plain function is equivalent to "primary.bbox_aspect_ratio".
def relative_height
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RegionRatioFilter::RelativeHeight, self)
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RatioParameterType::RelativeHeight, self)
end
# %DRC%
@@ -459,7 +459,7 @@ CODE
# The plain function is equivalent to "primary.area_ratio".
def area_ratio
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RegionRatioFilter::AreaRatio, self)
DRCOpNodeRatioParameterFilter::new(@engine, RBA::CompoundRegionOperationNode::RatioParameterType::AreaRatio, self)
end
# %DRC%
@@ -1240,7 +1240,7 @@ class DRCOpNodeWithCompare < DRCOpNode
attr_accessor :reverse
attr_accessor :original
attr_accessor :lt, :le, :gt, :ge, :arg
attr_accessor :ne_allowed
attr_accessor :mode_or_supported
attr_accessor :mode_or
def initialize(engine, original = nil, reverse = false)
@@ -1249,7 +1249,7 @@ class DRCOpNodeWithCompare < DRCOpNode
self.original = original
self.description = original ? original.description : "BasicWithCompare"
self.mode_or = false
self.ne_allowed = false
self.mode_or_supported = false
end
def _description_for_dump
@@ -1313,17 +1313,21 @@ class DRCOpNodeWithCompare < DRCOpNode
end
def !=(other)
if !self.ne_allowed
raise("!= operator is not allowed for '" + self.description + "'")
if self.respond_to?(:inverted)
res = self.==(other).inverted
else
if !self.mode_or_supported
raise("!= operator is not allowed for '" + self.description + "'")
end
if !(other.is_a?(Float) || other.is_a?(Integer))
raise("!= operator needs a numerical argument for '" + self.description + "' argument")
end
res = self._self_or_original
res.mode_or = true
res.set_lt(other)
res.set_gt(other)
end
if !(other.is_a?(Float) || other.is_a?(Integer))
raise("!= operator needs a numerical argument for '" + self.description + "' argument")
end
res = self._self_or_original
res.mode_or = true
res.set_lt(other)
res.set_gt(other)
return res
res
end
def ==(other)
@@ -1680,7 +1684,7 @@ class DRCOpNodeCheck < DRCOpNodeWithCompare
self.other = other
self.args = args
self.description = check.to_s
self.ne_allowed = true
self.mode_or_supported = true
end
def _description_for_dump
@@ -1772,6 +1776,39 @@ class DRCOpNodeBBoxParameterFilter < DRCOpNodeWithCompare
end
class DRCOpNodeRatioParameterFilter < DRCOpNodeWithCompare
attr_accessor :input
attr_accessor :parameter
attr_accessor :inverse
def initialize(engine, parameter, input)
super(engine)
self.parameter = parameter
self.input = input
self.inverse = false
self.description = parameter.to_s
end
def do_create_node(cache)
args = [ self.input.create_node(cache), self.parameter, self.inverse ]
args << (self.gt ? self.gt : (self.ge ? self.ge : 0.0))
args << (self.gt ? false : true)
if self.lt || self.le
args << (self.lt ? self.lt : self.le)
args << (self.lt ? false : true)
end
RBA::CompoundRegionOperationNode::new_ratio_filter(*args)
end
def inverted
res = self.dup
res.inverse = !res.inverse
return res
end
end
class DRCOpNodeCornersFilter < DRCOpNodeWithCompare
attr_accessor :input
@@ -652,16 +652,16 @@ CODE
# the operation acts similar to \Layer#with_angle.
%w(
angle
area
holes
hulls
length
odd_polygons
perimeter
rectangles
squares
rectilinear
length
angle
squares
).each do |f|
# NOTE: these methods are fallback for the respective global ones which route to DRCLayer or here.
eval <<"CODE"
@@ -1603,6 +1603,7 @@ CODE
moved
non_rectangles
non_rectilinear
non_squares
non_strict
not
notch
@@ -1646,6 +1647,7 @@ CODE
snap
snapped
space
squares
start_segments
strict
texts
@@ -1656,7 +1658,9 @@ CODE
width
with_angle
with_area
with_area_ratio
with_bbox_area
with_bbox_area_ratio
with_bbox_height
with_bbox_max
with_bbox_min
@@ -1664,13 +1668,17 @@ CODE
with_length
without_angle
without_area
without_area_ratio
without_bbox
without_bbox_area_ratio
without_bbox_height
without_bbox_max
without_bbox_min
without_length
without_perimeter
without_relative_height
with_perimeter
with_relative_height
xor
).each do |f|
eval <<"CODE"
+3 -3
View File
@@ -600,12 +600,12 @@ CODE
if args.size == 1
a = args[0]
if a.is_a?(Range)
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._prep_value(a.first), @engine._make_numeric_value(a.last), #{inv.inspect}))
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._make_numeric_value(a.first), @engine._make_numeric_value(a.last), #{inv.inspect}))
else
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._prep_value(a), #{inv.inspect}))
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._make_numeric_value(a), #{inv.inspect}))
end
elsif args.size == 2
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._prep_value(args[0]), @engine._make_numeric_value(args[1]), #{inv.inspect}))
DRCLayer::new(@engine, @engine._tcmd(self.data, 0, RBA::Region, :with_#{f}, @engine._make_numeric_value(args[0]), @engine._make_numeric_value(args[1]), #{inv.inspect}))
else
raise("Invalid number of arguments (1 or 2 expected)")
end
+10
View File
@@ -198,3 +198,13 @@ TEST(13d)
{
run_test (_this, "13", true);
}
TEST(14)
{
run_test (_this, "14", false);
}
TEST(14d)
{
run_test (_this, "14", true);
}
+10
View File
@@ -1127,3 +1127,13 @@ TEST(25d_spaceWithOptions)
{
run_test (_this, "25", true);
}
TEST(26_attributes)
{
run_test (_this, "26", false);
}
TEST(26d_attributes)
{
run_test (_this, "26", true);
}