#!/usr/bin/env python

# Test the KiCad plugin regarding some expected features.

# 1) Build target _pcbnew after enabling scripting in cmake.
# $ make _pcbnew

# 2) Changed dir to pcbnew
# $ cd pcbnew
# $ pwd
# build/pcbnew

# 3) Entered following command line, script takes no arguments
# $ PYTHONPATH=. <path_to>/test_kicad_plugin.py

from __future__ import print_function
from pcbnew import IO_MGR, BOARD, FOOTPRINT, LIB_ID, UTF8
from os import rename as mv

tmp_path = '/tmp'
lib_path1 = "%s/lib1.pretty" % tmp_path
lib_path2 = "%s/lib2.pretty" % tmp_path

plugin = IO_MGR.PluginFind( IO_MGR.KICAD_SEXP )

# Expecting "KiCad":
print( "Plugin Type: %s" % plugin.PluginName() )

try:
    plugin.FootprintLibDelete( lib_path1 )
except:
    pass    # ignore, new may not exist if first run

try:
    plugin.FootprintLibDelete( lib_path2 )
except:
    pass    # ignore, new may not exist if first run

plugin.FootprintLibCreate( lib_path1 )

# Verify that the same plugin instance can edge trigger on a lib_path change
# for a FootprintLibCreate()
plugin.FootprintLibCreate( lib_path2 )

board = BOARD()

# The only way to construct a FOOTPRINT is to pass it a BOARD? Yep.
module = FOOTPRINT( board )

fpid = LIB_ID( '', 'mine' )

module.SetFPID( fpid )

plugin.FootprintSave( lib_path2, module )

# Verify that the same plugin instance can edge trigger on a lib_path change
# for a FootprintSave()
plugin.FootprintSave( lib_path1, module )

# create a disparity between the library's name ("footprint"),
# and the module's internal useless name ("mine").  Module is officially named "footprint" now
# but has (module mine ...) internally:
mv( "%s/mine.kicad_mod" % lib_path2, "%s/footprint.kicad_mod" % lib_path2 )

footprint = plugin.FootprintLoad( lib_path2, 'footprint' )

fpid = footprint.GetFPID()
fpid.SetLibNickname( UTF8( 'mylib' ) )
name = fpid.Format( fpid ).GetChars() # example to get the UTF8 char buffer

# Always after a FootprintLoad() the internal name should match the one used to load it.
print( "Internal name should be 'footprint': '%s'" % name  )

# Verify that the same plugin instance can edge trigger on a lib_path change
# for FootprintLoad()
footprint = plugin.FootprintLoad( lib_path1, 'mine' )

fpid = footprint.GetFPID()
fpid.SetLibNickname( UTF8( 'other_mylib' ) )

# Always after a FootprintLoad() the internal name should match the one used to load it.
# Example to print an UTF8 string
print( "Internal name should be 'mine': '%s'" % fpid.Format( fpid ) )

# As of 3-Dec-2013 this test is passed by KICAD_PLUGIN and Wayne is owed an atta boy!

