; test Item methods for creating and positioning in GroupLayer

; This is part 2: more tests of more arcane cases

; The test script uses v3 binding of return values
(script-fu-use-v3)


; setup
(define testImage (testing:load-test-image-basic-v3 "gimp-logo.png"))
(displayln testImage)
(define testLayer (vector-ref (gimp-image-get-layers testImage )
                              0))
; gimp-logo.png has only one layer

; another layer for reorder tests
(define testLayer2 (gimp-layer-new
                    testImage
                    21
                    22
                    RGB-IMAGE
                    "LayerNew"
                    50.0
                    LAYER-MODE-NORMAL))


; group-new not throw
; This is setup, not an assert, because we need to capture the group's ID
; Note the ID is not wrapped in list
(define testGroup (gimp-group-layer-new testImage))
(define testGroup2 (gimp-group-layer-new testImage))



; tests


(test! "nested GroupLayer")

; group can be inserted in image
; Note parent is zero (NULL)
(assert `(gimp-image-insert-layer
            ,testImage
            ,testGroup
            0  ; parent
            0  ))  ; position within parent

; insertion effective: image now has two root layers, a layer and empty group
(assert `(= (vector-length (gimp-image-get-layers ,testImage))
            2))

; Groups can be nested
(assert `(gimp-image-insert-layer
            ,testImage
            ,testGroup2
            ,testGroup  ; parent
            0  ))  ; position within parent

; insertion effective: image still has only two root layers, a layer and a group
(assert `(= (vector-length (gimp-image-get-layers ,testImage))
            2))




(test! "move item between two groups")

; Initial condition:
; testLayer
; testGroup
;    testGroup2

; testLayer is at the top
(assert `(= (gimp-item-get-parent ,testLayer) -1))

; move testLayer to next level
(assert `(gimp-image-reorder-item ,testImage ,testLayer ,testGroup 0))

; reorder effective: image has one root layer, a group
(assert `(= (vector-length (gimp-image-get-layers ,testImage))
            1))
; effective: testLayer is parented to testGroup
(assert `(= (gimp-item-get-parent ,testLayer) ,testGroup))

; Condition:
; testGroup
;    testLayer
;    testGroup2

; move to a deeper group
(assert `(gimp-image-reorder-item ,testImage ,testLayer ,testGroup2 0))

; effective: testLayer is parented to testGroup2
(assert `(= (gimp-item-get-parent ,testLayer) ,testGroup2))




(test! "Error to create cycles in layer graph")

; Now group2 is in group.  Error to move group into group2, i.e. parent into child
(assert-error `(gimp-image-reorder-item
                  ,testImage
                  ,testGroup  ; moved item
                  ,testGroup2 ; parent
                  0)
              "Procedure execution of gimp-image-reorder-item failed on invalid input arguments:")
; suffix of err msg:
; Item 'Layer Group' (4) must not be an ancestor of 'Layer Group #1' (5)




(test! "Text layers can be reordered")

(define testFont (gimp-context-get-font))

(define testTextLayer
  (gimp-text-font
    testImage
    -1     ; drawable.  -1 means NULL means create new text layer
    0 0   ; coords
    "bar" ; text
    1     ; border size
    1     ; antialias true
    31    ; fontsize
    testFont ))

; text layer is already in image

; Condition:
; testTextLayer
; testGroup
;    testLayer
;    testGroup2

(assert `(= (vector-length (gimp-image-get-layers ,testImage))
            2))
(assert `(= (gimp-image-get-item-position ,testImage ,testTextLayer)
            0))

; move TextLayer to a deeper group
(assert `(gimp-image-reorder-item ,testImage ,testTextLayer ,testGroup2 0))

; effective: TextLayer parent is testGroup2
(assert `(= (gimp-item-get-parent ,testTextLayer) ,testGroup2))





; Channels and Paths are in a separate item tree
; No support for groups of Channels or Paths


(test! "Channels as Item with parent and position")

; Channels are Items but reorder-item only works with subclass Layer
; There is no such thing as a ChannelGroup

; I.E. only layers can be reordered
(define testChannel (gimp-channel-new
            testImage      ; image
            "Test Channel" ; name
            23 24          ; width, height
            50.0           ; opacity
            "red" ))      ; compositing color

; Can insert into image
(assert `(gimp-image-insert-channel
            ,testImage
            ,testChannel
            0            ; parent, moot since channel groups not supported
            0))          ; position in stack

; A channel has a position in its parent
(assert `(= (gimp-image-get-item-position ,testImage ,testChannel)
            0))

; A channel parent is always top level.
; The parent of a channel is not a layer.
(assert `(= (gimp-item-get-parent ,testChannel) -1))



(test! "Channels cannot be reordered into the layer tree")

; Error to parent a channel into the layer tree, into a group layer
(assert-error `(gimp-image-reorder-item
                  ,testImage
                  ,testChannel ; moved item
                  ,testGroup2  ; parent
                  0)
              "Procedure execution of gimp-image-reorder-item failed on invalid input arguments:")
; suffix of err message
; Items 'Test Channel' (6) and 'Layer Group #1' (5) cannot be used because they are not part of the same item tree



(test! "Path layers as items with parent and position.")

(define testPath (gimp-path-new
                        testImage
                        "Test Path"))
; a new Path is not in the image
(assert `(= (vector-length (gimp-image-get-paths ,testImage))
            0))

; !!! Even before inserted in image, path has parent but not position!!!

; Path has parent
(assert `(= (gimp-item-get-parent ,testPath)
            -1))

; Error to get position of Path not inserted in image
(assert-error `(gimp-image-get-item-position ,testImage ,testPath)
              "Procedure execution of gimp-image-get-item-position failed on invalid input arguments:")
; suffix of err msg
; Item 'Test Path' (8) cannot be used because it has not been added to an image

(assert  `(gimp-image-insert-path
                  ,testImage
                  ,testPath
                  0 0)) ; parent=0 position=0

; A Path's parent is always top level.
; The parent of a Path is not a layer.
(assert `(= (gimp-item-get-parent ,testPath)
            -1))

; A Path has a position in its parent, after Path was inserted
(assert `(= (gimp-image-get-item-position ,testImage ,testPath)
            0))



(test! "Path layers cannot be reordered into layer tree")

; Error to parent a Path into the layer tree, into a group layer
(assert-error `(gimp-image-reorder-item
                  ,testImage
                  ,testPath ; moved item
                  ,testGroup2  ; parent
                  0)
              "Procedure execution of gimp-image-reorder-item failed on invalid input arguments:")
; suffix of err msg
; Items 'Test Path' (8) and 'Layer Group #1' (5) cannot be used because they are not part of the same item tree




(script-fu-use-v2)
