# encoding: UTF-8

# KLayout Layout Viewer
# Copyright (C) 2006-2025 Matthias Koefferlein
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

if !$:.member?(File::dirname($0))
  $:.push(File::dirname($0))
end

load("test_prologue.rb")

class DBInstElement_TestClass < TestBase

  #  InstElement tests
  def test_1_InstElement 

    ly = RBA::Layout::new
    ci1 = ly.add_cell( "c1" )
    ci2 = ly.add_cell( "c2" )
    ci3 = ly.add_cell( "c3" )
    ci4 = ly.add_cell( "c4" )
    assert_equal( ci1, 0 )
    assert_equal( ci2, 1 )
    assert_equal( ci3, 2 )
    assert_equal( ci4, 3 )
    c1 = ly.cell( ci1 )
    c2 = ly.cell( ci2 )
    c3 = ly.cell( ci3 )
    c4 = ly.cell( ci4 )
    pid = ly.properties_id( { 17 => "a", "b" => [ 1, 5, 7 ] }.to_a )

    tr = RBA::Trans::new( RBA::Trans::R90, RBA::Point::new( 100, -50 ) ) 
    inst1 = RBA::CellInstArray::new( 1, tr )
    c1.insert( inst1 )

    tr = RBA::CplxTrans::new( 1.5, 90.0, true, RBA::DPoint::new( 100, -50 ) ) 
    inst2 = RBA::CellInstArray::new( 2, tr )
    c1.insert( inst2, pid )

    tr = RBA::Trans::new( RBA::Trans::R90, RBA::Point::new( 100, -50 ) )
    inst3 = RBA::CellInstArray::new( 3, tr, RBA::Point::new( 100, 0 ), RBA::Point::new( 0, 100 ), 10, 20 )
    c1.insert( inst3 )

    inst1r = nil
    inst2r = nil
    inst3r = nil
    c1.each_inst { |inst| inst1r = inst if inst.cell_index == 1; }
    c1.each_inst { |inst| inst2r = inst if inst.cell_index == 2; }
    c1.each_inst { |inst| inst3r = inst if inst.cell_index == 3; }
    assert_equal( inst1r.cell_index, 1 )
    assert_equal( inst2r.cell_index, 2 )
    assert_equal( inst3r.cell_index, 3 )
    assert_equal( inst1r == inst1r, true )
    assert_equal( inst1r < inst1r, false )
    assert_equal( inst1r == inst2r, false )
    assert_equal( (inst1r < inst2r ? 1 : 0) + (inst2r < inst1r ? 1 : 0), 1 )
    assert_equal( inst1r != inst1r, false )
    assert_equal( inst1r != inst2r, true )

    ie1 = RBA::InstElement::new( inst1r )
    ie2 = RBA::InstElement::new( inst2r )
    ie3 = RBA::InstElement::new( inst3r )

    assert_equal( ie1.cell_inst.cell_index, 1 )
    assert_equal( ie2.cell_inst.cell_index, 2 )
    assert_equal( ie3.cell_inst.cell_index, 3 )
    assert_equal( ie1 == ie1, true )
    assert_equal( ie1 == ie2, false )
    assert_equal( ie1 < ie1, false )
    assert_equal( (ie1 < ie2 ? 1 : 0) + (ie2 < ie1 ? 1 : 0), 1 )
    assert_equal( ie1 != ie1, false )
    assert_equal( ie1 != ie2, true )

    assert_equal( ie1.array_member_trans.to_s, "r0 0,0" )
    assert_equal( ie1.specific_trans.to_s, "r90 100,-50" )
    assert_equal( ie1.cell_inst.trans.to_s, "r90 100,-50" )
    assert_equal( ie1.specific_cplx_trans.to_s, "r90 *1 100,-50" )
    assert_equal( ie1.cell_inst.cplx_trans.to_s, "r90 *1 100,-50" )

    assert_equal( ie2.array_member_trans.to_s, "r0 0,0" )
    assert_equal( ie2.specific_trans.to_s, "m45 100,-50" )
    assert_equal( ie2.cell_inst.trans.to_s, "m45 100,-50" )
    assert_equal( ie2.specific_cplx_trans.to_s, "m45 *1.5 100,-50" )
    assert_equal( ie2.cell_inst.cplx_trans.to_s, "m45 *1.5 100,-50" )

    assert_equal( ie3.array_member_trans.to_s, "r0 0,0" )
    assert_equal( ie3.specific_trans.to_s, "r90 100,-50" )
    assert_equal( ie3.cell_inst.trans.to_s, "r90 100,-50" )
    assert_equal( ie3.specific_cplx_trans.to_s, "r90 *1 100,-50" )
    assert_equal( ie3.cell_inst.cplx_trans.to_s, "r90 *1 100,-50" )

    ie3 = RBA::InstElement::new( inst3r, 1, 5 )
    assert_equal( ie3.cell_inst.cell_index, 3 )

    assert_equal( ie3.array_member_trans.to_s, "r0 100,500" )
    assert_equal( ie3.specific_trans.to_s, "r90 200,450" )
    assert_equal( ie3.cell_inst.trans.to_s, "r90 100,-50" )
    assert_equal( ie3.specific_cplx_trans.to_s, "r90 *1 200,450" )
    assert_equal( ie3.cell_inst.cplx_trans.to_s, "r90 *1 100,-50" )

  end

end

load("test_epilogue.rb")
