/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtCore>
#include <QtTest/QTest>
#include <shared.h>

class tst_deployment_mac : public QObject
{
Q_OBJECT
private slots:
    void testParseOtoolLibraryLine();
    void testgetQtFrameworks();
    void testFindAppBinarty();
};

void tst_deployment_mac::testParseOtoolLibraryLine()
{
{
    QString line = "   /Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.4.0, current version 4.4.0)";
    FrameworkInfo info = parseOtoolLibraryLine(line);    
//    qDebug() << info;
    QCOMPARE(info.frameworkDirectory, QLatin1String("/Users/foo/build/qt-4.4/lib/")); 
    QCOMPARE(info.frameworkName, QLatin1String("QtGui.framework")); 
    QCOMPARE(info.frameworkPath, QLatin1String("/Users/foo/build/qt-4.4/lib/QtGui.framework"));
    QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4"));
    QCOMPARE(info.binaryName, QLatin1String("QtGui"));
    QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/QtGui"));
    QCOMPARE(info.version, QLatin1String("4"));
    QCOMPARE(info.installName, QLatin1String("/Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui"));
    QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui"));
    QCOMPARE(info.sourceFilePath, QLatin1String("/Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui"));
    QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/QtGui.framework/Versions/4"));
}
{
    QString line = "	/Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon (compatibility version 4.1.0, current version 4.1.0)";
    FrameworkInfo info = parseOtoolLibraryLine(line);    
//    qDebug() << info;
    QCOMPARE(info.frameworkDirectory, QLatin1String("/Users/foo/build/qt-4.4/lib/")); 
    QCOMPARE(info.frameworkName, QLatin1String("phonon.framework")); 
    QCOMPARE(info.frameworkPath, QLatin1String("/Users/foo/build/qt-4.4/lib/phonon.framework"));
    QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4"));
    QCOMPARE(info.binaryName, QLatin1String("phonon"));
    QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/phonon"));
    QCOMPARE(info.version, QLatin1String("4"));
    QCOMPARE(info.installName, QLatin1String("/Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.sourceFilePath, QLatin1String("/Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/phonon.framework/Versions/4"));
}

{
    QString line = "	/usr/local/Trolltech/Qt-4.4.0/lib/phonon.framework/Versions/4/phonon (compatibility version 4.1.0, current version 4.1.0)";
    FrameworkInfo info = parseOtoolLibraryLine(line);    
//    qDebug() << info;
    QCOMPARE(info.frameworkDirectory, QLatin1String("/usr/local/Trolltech/Qt-4.4.0/lib/")); 
    QCOMPARE(info.frameworkName, QLatin1String("phonon.framework")); 
    QCOMPARE(info.frameworkPath, QLatin1String("/usr/local/Trolltech/Qt-4.4.0/lib/phonon.framework"));
    QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4"));
    QCOMPARE(info.binaryName, QLatin1String("phonon"));
    QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/phonon"));
    QCOMPARE(info.version, QLatin1String("4"));
    QCOMPARE(info.installName, QLatin1String("/usr/local/Trolltech/Qt-4.4.0/lib/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.sourceFilePath, QLatin1String("/usr/local/Trolltech/Qt-4.4.0/lib/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/phonon.framework/Versions/4"));
}

{
    QString line = "	QtGui.framework/Versions/4/QtGui (compatibility version 4.1.0, current version 4.1.0)";
    FrameworkInfo info = parseOtoolLibraryLine(line);    
//    qDebug() << info;
    QCOMPARE(info.frameworkDirectory, QLatin1String("/Library/Frameworks/")); 
    QCOMPARE(info.frameworkName, QLatin1String("QtGui.framework")); 
    QCOMPARE(info.frameworkPath, QLatin1String("/Library/Frameworks/QtGui.framework"));
    QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4"));
    QCOMPARE(info.binaryName, QLatin1String("QtGui"));
    QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/QtGui"));
    QCOMPARE(info.version, QLatin1String("4"));
    QCOMPARE(info.installName, QLatin1String("QtGui.framework/Versions/4/QtGui"));
    QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui"));
    QCOMPARE(info.sourceFilePath, QLatin1String("/Library/Frameworks/QtGui.framework/Versions/4/QtGui"));
    QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/QtGui.framework/Versions/4"));
}

{
    QString line = "	phonon.framework/Versions/4/QtGui (compatibility version 4.1.0, current version 4.1.0)";
    FrameworkInfo info = parseOtoolLibraryLine(line);    
//    qDebug() << info;
    QCOMPARE(info.frameworkDirectory, QLatin1String("/Library/Frameworks/")); 
    QCOMPARE(info.frameworkName, QLatin1String("phonon.framework")); 
    QCOMPARE(info.frameworkPath, QLatin1String("/Library/Frameworks/phonon.framework"));
    QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4"));
    QCOMPARE(info.binaryName, QLatin1String("phonon"));
    QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/phonon"));
    QCOMPARE(info.version, QLatin1String("4"));
    QCOMPARE(info.installName, QLatin1String("phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.sourceFilePath, QLatin1String("/Library/Frameworks/phonon.framework/Versions/4/phonon"));
    QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/phonon.framework/Versions/4"));
}

{
    QString line = "	/Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib (compatibility version 4.4.0, current version 4.4.0)";
    FrameworkInfo info = parseOtoolLibraryLine(line);    
//    qDebug() << info;
    QCOMPARE(info.frameworkDirectory, QLatin1String("/Users/foo/build/qt-4.4/lib/")); 
    QCOMPARE(info.binaryName, QLatin1String("libQtCLucene.4.dylib"));
    QCOMPARE(info.frameworkName, QLatin1String("libQtCLucene.4.dylib")); 
    QCOMPARE(info.frameworkPath, QLatin1String("/Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib"));
    QCOMPARE(info.installName, QLatin1String("/Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib"));
    QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/libQtCLucene.4.dylib"));
    QCOMPARE(info.sourceFilePath, QLatin1String("/Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib"));
    QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/"));
}
{
    QString line = "libQtCLucene.4.dylib (compatibility version 4.4.0, current version 4.4.0)";
    FrameworkInfo info = parseOtoolLibraryLine(line);
//    qDebug() << info;
    QCOMPARE(info.frameworkDirectory, QLatin1String("/usr/lib/")); 
    QCOMPARE(info.binaryName, QLatin1String("libQtCLucene.4.dylib"));
    QCOMPARE(info.frameworkName, QLatin1String("libQtCLucene.4.dylib")); 
    QCOMPARE(info.frameworkPath, QLatin1String("/usr/lib/libQtCLucene.4.dylib"));
    QCOMPARE(info.installName, QLatin1String("libQtCLucene.4.dylib"));
    QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/libQtCLucene.4.dylib"));
    QCOMPARE(info.sourceFilePath, QLatin1String("/usr/lib/libQtCLucene.4.dylib"));
    QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/"));
}
{
    QString line = "/foo"; //invalid
    FrameworkInfo info = parseOtoolLibraryLine(line);
    QCOMPARE(info.frameworkName, QString()); 
}

}

void tst_deployment_mac::testgetQtFrameworks()
{
{
    QStringList otool = QStringList()
	<< "/Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon (compatibility version 4.1.0, current version 4.1.0)"
	<< "/Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.4.0, current version 4.4.0)"
	<< "/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)"
	<< "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.27.0)"
	<< "/Users/foo/build/qt-4.4/lib/QtCore.framework/Versions/4/QtCore (compatibility version 4.4.0, current version 4.4.0)"
	<< "/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)"
	<< "/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)"
	<< "/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)"
	<< "/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)"
    << " "
    ;
    
    QList<FrameworkInfo> frameworks = getQtFrameworks(otool);
    QCOMPARE(frameworks.count(), 3);
    QCOMPARE(frameworks.at(0).binaryName, QLatin1String("phonon"));
    QCOMPARE(frameworks.at(1).binaryName, QLatin1String("QtGui"));
    QCOMPARE(frameworks.at(2).binaryName, QLatin1String("QtCore"));
}
{
    QStringList otool = QStringList()
    << "QtHelp.framework/Versions/4/QtHelp (compatibility version 4.4.0, current version 4.4.0)"
	<< "libQtCLucene.4.dylib (compatibility version 4.4.0, current version 4.4.0)"
	<< "QtSql.framework/Versions/4/QtSql (compatibility version 4.4.0, current version 4.4.0)"
	<< "QtXml.framework/Versions/4/QtXml (compatibility version 4.4.0, current version 4.4.0)"
	<< "QtGui.framework/Versions/4/QtGui (compatibility version 4.4.0, current version 4.4.0)"
	<< "/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 128.0.0)"
	<< "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 824.42.0)"
	<< "QtNetwork.framework/Versions/4/QtNetwork (compatibility version 4.4.0, current version 4.4.0)"
	<< "QtCore.framework/Versions/4/QtCore (compatibility version 4.4.0, current version 4.4.0)"
	<< "/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)"
	<< "/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.6)"
	<< "/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)"
	<< "/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)"
    ;

    QList<FrameworkInfo> frameworks = getQtFrameworks(otool);
    QCOMPARE(frameworks.count(), 7);
    QCOMPARE(frameworks.at(0).binaryName, QLatin1String("QtHelp"));
    QCOMPARE(frameworks.at(1).binaryName, QLatin1String("libQtCLucene.4.dylib"));
    QCOMPARE(frameworks.at(2).binaryName, QLatin1String("QtSql"));
    QCOMPARE(frameworks.at(3).binaryName, QLatin1String("QtXml"));
    QCOMPARE(frameworks.at(4).binaryName, QLatin1String("QtGui"));
    QCOMPARE(frameworks.at(5).binaryName, QLatin1String("QtNetwork"));
    QCOMPARE(frameworks.at(6).binaryName, QLatin1String("QtCore"));
}

}

void tst_deployment_mac::testFindAppBinarty()
{
    QCOMPARE(findAppBinary("tst_deployment_mac.app"), QLatin1String("tst_deployment_mac.app/Contents/MacOS/tst_deployment_mac"));
}

QTEST_MAIN(tst_deployment_mac)

#include "tst_deployment_mac.moc"