DEST testPcpMuseum_SubrootReferenceAndVariants
)
+pxr_install_test_dir(
+ SRC testenv/testPcpMuseum_SubrootReferenceAndVariants2.testenv
+ DEST testPcpMuseum_SubrootReferenceAndVariants2
+)
+
pxr_install_test_dir(
SRC testenv/testPcpMuseum_TimeCodesPerSecond.testenv
DEST testPcpMuseum_TimeCodesPerSecond1
DEST testPcpMuseum_TrickyVariantSelectionInVariant
)
+pxr_install_test_dir(
+ SRC testenv/testPcpMuseum_TrickyVariantSelectionInVariant2.testenv
+ DEST testPcpMuseum_TrickyVariantSelectionInVariant2
+)
+
pxr_install_test_dir(
SRC testenv/testPcpMuseum_TrickyVariantWeakerSelection.testenv
DEST testPcpMuseum_TrickyVariantWeakerSelection
DEST testPcpMuseum_TrickyVariantWeakerSelection3
)
+pxr_install_test_dir(
+ SRC testenv/testPcpMuseum_TrickyVariantWeakerSelection4.testenv
+ DEST testPcpMuseum_TrickyVariantWeakerSelection4
+)
+
pxr_install_test_dir(
SRC testenv/testPcpMuseum_TrickyClassHierarchy.testenv
DEST testPcpMuseum_TrickyClassHierarchy
DEST testPcpMuseum_TrickyMultipleRelocations4
)
+pxr_install_test_dir(
+ SRC testenv/testPcpMuseum_TrickyMultipleRelocations5.testenv
+ DEST testPcpMuseum_TrickyMultipleRelocations5
+)
+
pxr_install_test_dir(
SRC testenv/testPcpMuseum_TrickyMultipleRelocationsAndClasses.testenv
DEST testPcpMuseum_TrickyMultipleRelocationsAndClasses
SDF_SCHEMA_PROHIBIT_INVALID_VARIANT_SELECTIONS=0
)
+pxr_register_test(testPcpMuseum_SubrootReferenceAndVariants2
+ PYTHON
+ COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults SubrootReferenceAndVariants2/root.sdf"
+ STDOUT_REDIRECT compositionResults_SubrootReferenceAndVariants2.txt
+ DIFF_COMPARE compositionResults_SubrootReferenceAndVariants2.txt
+)
+
pxr_register_test(testPcpMuseum_TimeCodesPerSecond1
PYTHON
COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults TimeCodesPerSecond/root.sdf"
DIFF_COMPARE compositionResults_TrickyVariantSelectionInVariant.txt
)
+pxr_register_test(testPcpMuseum_TrickyVariantSelectionInVariant2
+ PYTHON
+ COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults TrickyVariantSelectionInVariant2/root.sdf"
+ STDOUT_REDIRECT compositionResults_TrickyVariantSelectionInVariant2.txt
+ DIFF_COMPARE compositionResults_TrickyVariantSelectionInVariant2.txt
+)
+
pxr_register_test(testPcpMuseum_TrickyVariantWeakerSelection
PYTHON
COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults TrickyVariantWeakerSelection/root.sdf"
DIFF_COMPARE compositionResults_TrickyVariantWeakerSelection3.txt
)
+pxr_register_test(testPcpMuseum_TrickyVariantWeakerSelection4
+ PYTHON
+ COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults TrickyVariantWeakerSelection4/root.sdf"
+ STDOUT_REDIRECT compositionResults_TrickyVariantWeakerSelection4.txt
+ DIFF_COMPARE compositionResults_TrickyVariantWeakerSelection4.txt
+)
+
pxr_register_test(testPcpMuseum_TrickyClassHierarchy
PYTHON
COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults TrickyClassHierarchy/root.sdf"
DIFF_COMPARE compositionResults_TrickyMultipleRelocations4.txt compositionErrors_TrickyMultipleRelocations4.txt
)
+pxr_register_test(testPcpMuseum_TrickyMultipleRelocations5
+ PYTHON
+ COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults TrickyMultipleRelocations5/root.sdf"
+ STDOUT_REDIRECT compositionResults_TrickyMultipleRelocations5.txt
+ DIFF_COMPARE compositionResults_TrickyMultipleRelocations5.txt
+)
+
pxr_register_test(testPcpMuseum_TrickyMultipleRelocationsAndClasses
PYTHON
COMMAND "${CMAKE_INSTALL_PREFIX}/tests/testPcpCompositionResults TrickyMultipleRelocationsAndClasses/root.sdf"
--- /dev/null
+#sdf 1.4.32
+
+def "Ref"
+{
+ def "Child"
+ {
+ def "Child2"
+ {
+ def "Class"
+ {
+ }
+ }
+ }
+}
#sdf 1.4.32
(
"""
- This file has a CharRig with a reference to a nested PathRig.
- The Path prim under the PathRig is relocated to the anim scope,
- but there is also an illegal override at the old location.
- This should be reported as an error and ignored.
+ This file has several examples of invalid opinions at
+ relocation source locations.
"""
)
def "CharRig" (
+ """
+ CharRig has a reference to a nested PathRig.
+ The Path prim under the PathRig is relocated to the anim scope,
+ but there is also an illegal override at the old location.
+ This should be reported as an error and ignored.
+ """
relocates = {
</CharRig/Rig/PathRig/Path>: </CharRig/Anim/Path>
}
}
}
}
+
+def "VariantAtRelocateSource" (
+ """
+ The child prim Inherit inherits from the prim Sibling/Class,
+ and the prim Sibling was relocated from Child/Child2.
+
+ During composition, the ancestral variant set and selection authored on
+ Child should contribute opinions, but the variant on Child/Child2 should
+ not. This is because composition prohibits opinions over the source of a
+ relocated prim, and Child/Child2 is the source for the relocated prim
+ Sibling.
+ """
+ references = @./ref.sdf@</Ref>
+ relocates = {
+ <Child/Child2> : <Sibling>
+ }
+)
+{
+ over "Child" (
+ variantSets = "child"
+ variants = {
+ string child = "a"
+ }
+ )
+ {
+ variantSet "child" = {
+ "a" {
+ over "Child2"
+ {
+ over "Class"
+ {
+ }
+ }
+ }
+ }
+
+ over "Child2" (
+ variantSets = "child2"
+ variants = {
+ string child2 = "a"
+ }
+ )
+ {
+ variantSet "child2" = {
+ "a" {
+ over "Class"
+ {
+ }
+ }
+ }
+ }
+ }
+
+ over "Sibling"
+ {
+ over "Class"
+ {
+ }
+ }
+
+ def "Inherit" (
+ inherits = </VariantAtRelocateSource/Sibling/Class>
+ )
+ {
+ }
+}
The layer @ErrorOpinionAtRelocationSource/root.sdf@ has an invalid opinion at the relocation source path </CharRig/Rig/PathRig/Path>, which will be ignored.
+------------------------------------------------------------------------
+Errors while composing </VariantAtRelocateSource/Sibling>
+
+The layer @ErrorOpinionAtRelocationSource/root.sdf@ has an invalid opinion at the relocation source path </VariantAtRelocateSource/Child/Child2>, which will be ignored.
+
+------------------------------------------------------------------------
+Errors while composing </VariantAtRelocateSource/Inherit>
+
+The layer @ErrorOpinionAtRelocationSource/root.sdf@ has an invalid opinion at the relocation source path </VariantAtRelocateSource/Child/Child2>, which will be ignored.
+
Prohibited child names:
['Path']
+------------------------------------------------------------------------
+Results for composing </VariantAtRelocateSource>
+
+Prim Stack:
+ root.sdf /VariantAtRelocateSource
+ ref.sdf /Ref
+
+Child names:
+ ['Child', 'Sibling', 'Inherit']
+
+------------------------------------------------------------------------
+Results for composing </VariantAtRelocateSource/Child>
+
+Prim Stack:
+ root.sdf /VariantAtRelocateSource/Child
+ root.sdf /VariantAtRelocateSource/Child{child=a}
+ ref.sdf /Ref/Child
+
+Variant Selections:
+ {child = a}
+
+Prohibited child names:
+ ['Child2']
+
+------------------------------------------------------------------------
+Results for composing </VariantAtRelocateSource/Sibling>
+
+Prim Stack:
+ root.sdf /VariantAtRelocateSource/Sibling
+ root.sdf /VariantAtRelocateSource/Child{child=a}Child2
+ ref.sdf /Ref/Child/Child2
+
+Child names:
+ ['Class']
+
+------------------------------------------------------------------------
+Results for composing </VariantAtRelocateSource/Sibling/Class>
+
+Prim Stack:
+ root.sdf /VariantAtRelocateSource/Sibling/Class
+ root.sdf /VariantAtRelocateSource/Child{child=a}Child2/Class
+ ref.sdf /Ref/Child/Child2/Class
+
+------------------------------------------------------------------------
+Results for composing </VariantAtRelocateSource/Inherit>
+
+Prim Stack:
+ root.sdf /VariantAtRelocateSource/Inherit
+ root.sdf /VariantAtRelocateSource/Sibling/Class
+ root.sdf /VariantAtRelocateSource/Child{child=a}Child2/Class
+ ref.sdf /Ref/Child/Child2/Class
+
@ErrorPermissionDenied/root.sdf@</_PrivateClass>
which is private.
+------------------------------------------------------------------------
+Errors while composing </VariantsOpinionsOnRestrictedPrim/Child/Child2>
+
+@ErrorPermissionDenied/root.sdf@</VariantsOpinionsOnRestrictedPrim/Child{child=a}Child2>
+will be ignored because:
+@ErrorPermissionDenied/ref.sdf@</Ref/Child/Child2>
+is private and overrides its opinions.
+@ErrorPermissionDenied/root.sdf@</VariantsOpinionsOnRestrictedPrim/Child/Child2{child2=a}>
+will be ignored because:
+@ErrorPermissionDenied/ref.sdf@</Ref/Child/Child2>
+is private and overrides its opinions.
+@ErrorPermissionDenied/root.sdf@</VariantsOpinionsOnRestrictedPrim/Child/Child2>
+will be ignored because:
+@ErrorPermissionDenied/ref.sdf@</Ref/Child/Child2>
+is private and overrides its opinions.
+
/Model.attr:
root.sdf /Model.attr
+------------------------------------------------------------------------
+Results for composing </VariantsOpinionsOnRestrictedPrim>
+
+Prim Stack:
+ root.sdf /VariantsOpinionsOnRestrictedPrim
+ ref.sdf /Ref
+
+Child names:
+ ['Child']
+
+------------------------------------------------------------------------
+Results for composing </VariantsOpinionsOnRestrictedPrim/Child>
+
+Prim Stack:
+ root.sdf /VariantsOpinionsOnRestrictedPrim/Child
+ root.sdf /VariantsOpinionsOnRestrictedPrim/Child{child=a}
+ ref.sdf /Ref/Child
+
+Variant Selections:
+ {child = a}
+
+Child names:
+ ['Child2']
+
+------------------------------------------------------------------------
+Results for composing </VariantsOpinionsOnRestrictedPrim/Child/Child2>
+
+Prim Stack:
+ ref.sdf /Ref/Child/Child2
+
+Variant Selections:
+ {child2 = a}
+
--- /dev/null
+#sdf 1.4.32
+
+def "Ref"
+{
+ def "Child"
+ {
+ def "Child2" (
+ permission = private
+ )
+ {
+ }
+ }
+}
#sdf 1.4.32
(
"""
- This example has a prim, Root, with a reference to
- A.sdf. Root has an opinion about attr, which is
+ This file has examples of prims with invalid opinions
+ due to prim and property permission restrictions.
+ """
+)
+
+def "Root" (
+ """
+ Root has a reference to A.sdf.
+ Root has an opinion about attr, which is
private in A.sdf. This results in a property
permission error. In addition, Root has opinions about
a relationship and relational attribute that has been
marked private in A.sdf. This should also result in
permission errors, and the opinions should be ignored.
-
- There is another prim, Parent, with a child prim, Child.
- Parent has a reference to A.sdf, where Child is
- private. This results in a prim permission error.
-
- There is also a prim, Model, which inherits from
- _PrivateClass. Since _PrivateClass is private, this
- will result in an arc permission error.
"""
-)
-
-def "Root" (
add references = @./A.sdf@</A>
)
{
add rel privateRel = </Root.localAttr>
add rel publicRel = </Root.A_attr>
}
+
def "Parent" (
+ """
+ Parent has a reference to A.sdf, where Child is
+ private. This results in a prim permission error.
+ """
add references = @./A.sdf@</Parent>
)
{
{
}
}
+
def "_PrivateClass" (
permission = private
)
{
custom double attr = -1
}
+
def "Model" (
+ """
+ Model inherits from _PrivateClass. Since _PrivateClass is
+ private, this will result in an arc permission error.
+ """
add inherits = </_PrivateClass>
)
{
custom double attr = 0
}
+
+def "VariantsOpinionsOnRestrictedPrim" (
+ """
+ This prim has child prims Child and Child/Child2 that
+ come from across the reference. Child/Child2 has also
+ been marked as private across the reference. The opinions
+ on Child/Child2 in this layer stack defined in the
+ different variants should all be ignored.
+ """
+ references = @./ref.sdf@</Ref>
+)
+{
+ over "Child" (
+ variantSets = "child"
+ variants = {
+ string child = "a"
+ }
+ )
+ {
+ variantSet "child" = {
+ "a" {
+ over "Child2"
+ {
+ }
+ }
+ }
+
+ over "Child2" (
+ variantSets = "child2"
+ variants = {
+ string child2 = "a"
+ }
+ )
+ {
+ variantSet "child2" = {
+ "a" {
+ }
+ }
+ }
+ }
+}
--- /dev/null
+#sdf 1.4.32
+
+def "Inherit"
+{
+ def "CHARACTER"
+ {
+ }
+}
+
+def "Ref" (
+ inherits = </Inherit>
+)
+{
+ def "CHARACTER"
+ {
+ }
+}
+
+def "CHARGROUP" (
+ variantSets = "v"
+ variants = {
+ string v = "x"
+ }
+)
+{
+ over "CHARACTER"
+ {
+ }
+
+ variantSet "v" = {
+ "x" (
+ references = </Ref>
+ ) {
+ over "CHARACTER"
+ {
+ }
+ }
+ }
+}
+
+
--- /dev/null
+#sdf 1.4.32
+(
+ """
+ This museum test exercises behavior with subroot references,
+ ancestral variant selections, and inherit arcs.
+ """
+)
+
+def "Inherit"
+{
+ def "CHARACTER"
+ {
+ }
+}
+
+def "Character" (
+ """
+ The ancestral /CHARGROUP prim in the reference has a variant
+ that brings in another reference, which inherits /Inherit.
+ The inherit arc should be implied back to the root layer
+ stack and cause the /Inherit/CHARACTER opinion authored in
+ this layer to be included.
+ """
+ references = @./CharGroup.sdf@</CHARGROUP/CHARACTER>
+)
+{
+}
--- /dev/null
+Loading @SubrootReferenceAndVariants2/root.sdf@
+
+------------------------------------------------------------------------
+Layer Stack:
+ root.sdf
+
+------------------------------------------------------------------------
+Results for composing </Inherit>
+
+Prim Stack:
+ root.sdf /Inherit
+
+Child names:
+ ['CHARACTER']
+
+------------------------------------------------------------------------
+Results for composing </Inherit/CHARACTER>
+
+Prim Stack:
+ root.sdf /Inherit/CHARACTER
+
+------------------------------------------------------------------------
+Results for composing </Character>
+
+Prim Stack:
+ root.sdf /Character
+ root.sdf /Inherit/CHARACTER
+ CharGroup.sdf /CHARGROUP/CHARACTER
+ CharGroup.sdf /CHARGROUP{v=x}CHARACTER
+ CharGroup.sdf /Ref/CHARACTER
+ CharGroup.sdf /Inherit/CHARACTER
+
--- /dev/null
+#sdf 1.4.32
+
+def "CHARGROUP"
+{
+ def "CHARACTER"
+ {
+ }
+}
+
--- /dev/null
+#sdf 1.4.32
+
+over "Group" (
+ references = @./chargroup.sdf@</CHARGROUP>
+ relocates = {
+ <CHARACTER>: <Character>,
+ }
+)
+{
+ over "Character"
+ {
+ }
+}
+
--- /dev/null
+#sdf 1.4.32
+(
+ """
+ This museum test uses multiple relocations, one here in the
+ root layer and one in a variant further down a chain of
+ references.
+ """
+)
+
+def "Group" (
+ references = @./variant.sdf@</Group>
+ relocates = {
+ <Character>: <Model>,
+ }
+)
+{
+ over "Model"
+ {
+ }
+}
--- /dev/null
+#sdf 1.4.32
+
+def "Group" (
+ variantSets = "v"
+ variants = {
+ string v = "x"
+ }
+)
+{
+ variantSet "v" = {
+ "x" (
+ references = @./relocates.sdf@</Group>
+ ) {
+ over "Character"
+ {
+ }
+ }
+ }
+
+ over "Character"
+ {
+ }
+}
+
--- /dev/null
+Loading @TrickyMultipleRelocations5/root.sdf@
+
+------------------------------------------------------------------------
+Layer Stack:
+ root.sdf
+
+------------------------------------------------------------------------
+Results for composing </Group>
+
+Prim Stack:
+ root.sdf /Group
+ variant.sdf /Group
+ variant.sdf /Group{v=x}
+ relocates.sdf /Group
+ chargroup.sdf /CHARGROUP
+
+Variant Selections:
+ {v = x}
+
+Child names:
+ ['Model']
+
+Prohibited child names:
+ ['CHARACTER', 'Character']
+
+------------------------------------------------------------------------
+Results for composing </Group/Model>
+
+Prim Stack:
+ root.sdf /Group/Model
+ variant.sdf /Group/Character
+ variant.sdf /Group{v=x}Character
+ relocates.sdf /Group/Character
+ chargroup.sdf /CHARGROUP/CHARACTER
+
"""
)
-def Scope "A" (
+def "A" (
add variantSets = ["vset1", "vset2"]
)
{
variantSet "vset2" = {
"authored" (
) {
- def Scope "vset2_authored_child"
+ def "vset2_authored_child"
{
}
}
}
}
-def Scope "B" (
+def "A_Ancestral" (
+ references = </A/vset2_authored_child>
+)
+{
+}
+
+def "B" (
add variantSets = ["vset2", "vset1"]
)
{
variantSet "vset2" = {
"authored" (
) {
- def Scope "vset2_authored_child"
+ def "vset2_authored_child"
{
}
}
}
}
+
+def "B_Ancestral" (
+ references = </B/vset2_authored_child>
+)
+{
+}
Prim Stack:
root.sdf /A{vset2=authored}vset2_authored_child
+------------------------------------------------------------------------
+Results for composing </A_Ancestral>
+
+Prim Stack:
+ root.sdf /A_Ancestral
+ root.sdf /A{vset2=authored}vset2_authored_child
+
------------------------------------------------------------------------
Results for composing </B>
Prim Stack:
root.sdf /B{vset2=authored}vset2_authored_child
+------------------------------------------------------------------------
+Results for composing </B_Ancestral>
+
+Prim Stack:
+ root.sdf /B_Ancestral
+ root.sdf /B{vset2=authored}vset2_authored_child
+
"""
)
-def Scope "A" (
+def "A" (
add variantSets = ["vset1"]
references = [ </B> ]
)
{
+ def "Child"
+ {
+ }
+
variantSet "vset1" = {
"fallback" (
# This selection will not apply, because we
}
) {
string result = "used_selection";
+
+ def "Child"
+ {
+ }
}
}
}
-def scope "B" (
+def "B" (
add variantSets = ["vset2"]
variants = {
string vset2 = "selection"
}
)
{
+ def "Child"
+ {
+ }
+
variantSet "vset2" = {
"fallback" {
}
string vset1 = "selection"
}
) {
+ def "Child"
+ {
+ }
}
"ignored_selection" {
}
}
}
+
+def "C" (
+ references = </A/Child>
+)
+{
+}
{vset1 = selection}
{vset2 = selection}
+Child names:
+ ['Child']
+
Property names:
['result']
/A.result:
root.sdf /A{vset1=selection}.result
+------------------------------------------------------------------------
+Results for composing </A/Child>
+
+Prim Stack:
+ root.sdf /A/Child
+ root.sdf /A{vset1=selection}Child
+ root.sdf /B/Child
+ root.sdf /B{vset2=selection}Child
+
------------------------------------------------------------------------
Results for composing </B>
Variant Selections:
{vset2 = selection}
+Child names:
+ ['Child']
+
+------------------------------------------------------------------------
+Results for composing </B/Child>
+
+Prim Stack:
+ root.sdf /B/Child
+ root.sdf /B{vset2=selection}Child
+
+------------------------------------------------------------------------
+Results for composing </C>
+
+Prim Stack:
+ root.sdf /C
+ root.sdf /A/Child
+ root.sdf /A{vset1=selection}Child
+ root.sdf /B/Child
+ root.sdf /B{vset2=selection}Child
+
(
"""
This museum exhibit exercises the ability for variants to select other
- variants. This is a stripped down version of the repro case for bug
- 68105.
+ variants.
Within SlugJ_modelInterface.gen.sdf, the selection {shadingVariant=Axel}
is authored. In that variant, the selection {shaderBindingVariant=Wet} is
authored. This selection should be carried over when evaluating the
reference to /ShaderBindingVariants in SlugJ_shaderDisplayDefs.sdf.
-
- This relies on new variant selection behavior introduced in Pcp.
- This test case does not work as desired in Csd mode.
"""
)
--- /dev/null
+#sdf 1.4.32
+(
+ """
+ This museum case demonstrates the ability for a stronger
+ variant set to provide a variant selection for a weaker
+ variant set.
+ """
+)
+
+def "Ref" (
+ variantSets = ["v1", "v2"]
+ variants = {
+ string v1 = "a"
+ }
+)
+{
+ variantSet "v1" = {
+ "a" (
+ variants = {
+ string v2 = "b"
+ }
+ ) {
+ }
+ }
+
+ variantSet "v2" = {
+ "b" {
+ def "Model"
+ {
+ }
+ }
+ }
+}
+
+def "Root" (
+ """
+ Composition should pick up the variant {v2 = b} on /Ref when
+ composing ancestral opinions. The variant selection for v2
+ comes from stronger variant {v1 = a}, also authored on /Ref.
+ """
+ references = </Ref/Model>
+)
+{
+}
--- /dev/null
+Loading @TrickyVariantSelectionInVariant2/root.sdf@
+
+------------------------------------------------------------------------
+Layer Stack:
+ root.sdf
+
+------------------------------------------------------------------------
+Results for composing </Ref>
+
+Prim Stack:
+ root.sdf /Ref
+ root.sdf /Ref{v1=a}
+ root.sdf /Ref{v2=b}
+
+Variant Selections:
+ {v1 = a}
+ {v2 = b}
+
+Child names:
+ ['Model']
+
+------------------------------------------------------------------------
+Results for composing </Ref/Model>
+
+Prim Stack:
+ root.sdf /Ref{v2=b}Model
+
+------------------------------------------------------------------------
+Results for composing </Root>
+
+Prim Stack:
+ root.sdf /Root
+ root.sdf /Ref{v2=b}Model
+
--- /dev/null
+#sdf 1.4.32
+
+def Xform "bob_root_sphere"(
+){
+ def Sphere "bob_body"(
+ ){
+ }
+}
+
+def Xform "bob_root_cube"(
+){
+ def Cube "bob_body"(
+ ){
+ }
+}
--- /dev/null
+#sdf 1.4.32
+(
+ """
+ This museum case exercises a variant in a class which selects
+ a variant for the root node. This requires us to defer evaluation
+ of the root node variant until the weaker variant has been
+ evaluated.
+ """
+)
+
+class "_class_geotype" (
+ add variantSets = ["geotype_selector", "geotype"]
+)
+{
+ variantSet "geotype_selector" = {
+ "select_cube" (
+ variants = {
+ string geotype = "cube"
+ }
+ ) {
+
+ }
+ "select_sphere" (
+ variants = {
+ string geotype = "sphere"
+ }
+ ) {
+
+ }
+ }
+}
+
+def "bob" (
+ add inherits = </_class_geotype>
+ variants = {
+ string geotype_selector = "select_cube"
+ }
+ add variantSets = "geotype"
+)
+{
+ variantSet "geotype" = {
+ "cube" {
+ def "geom" (
+ references = @./geo.sdf@</bob_root_cube>
+ )
+ {
+ }
+ }
+ "sphere" {
+ def "geom" (
+ references = @./geo.sdf@</bob_root_sphere>
+ )
+ {
+ }
+ }
+ }
+}
+
+def "shape" (
+ references = </bob/geom>
+)
+{
+}
--- /dev/null
+Loading @TrickyVariantWeakerSelection4/root.sdf@
+
+------------------------------------------------------------------------
+Layer Stack:
+ root.sdf
+
+------------------------------------------------------------------------
+Results for composing </_class_geotype>
+
+Prim Stack:
+ root.sdf /_class_geotype
+
+------------------------------------------------------------------------
+Results for composing </bob>
+
+Prim Stack:
+ root.sdf /bob
+ root.sdf /_class_geotype
+ root.sdf /_class_geotype{geotype_selector=select_cube}
+ root.sdf /bob{geotype=cube}
+
+Variant Selections:
+ {geotype = cube}
+ {geotype_selector = select_cube}
+
+Child names:
+ ['geom']
+
+------------------------------------------------------------------------
+Results for composing </bob/geom>
+
+Prim Stack:
+ root.sdf /bob{geotype=cube}geom
+ geo.sdf /bob_root_cube
+
+Child names:
+ ['bob_body']
+
+------------------------------------------------------------------------
+Results for composing </bob/geom/bob_body>
+
+Prim Stack:
+ geo.sdf /bob_root_cube/bob_body
+
+------------------------------------------------------------------------
+Results for composing </shape>
+
+Prim Stack:
+ root.sdf /shape
+ root.sdf /bob{geotype=cube}geom
+ geo.sdf /bob_root_cube
+
+Child names:
+ ['bob_body']
+
+------------------------------------------------------------------------
+Results for composing </shape/bob_body>
+
+Prim Stack:
+ geo.sdf /bob_root_cube/bob_body
+