github.com/go-ole/go-ole@v1.2.6/safearrayconversion_test.go (about)

     1  // +build windows
     2  
     3  package ole
     4  
     5  import (
     6  	"fmt"
     7  	"strings"
     8  	"testing"
     9  )
    10  
    11  // This tests more than one function. It tests all of the functions needed in order to retrieve an
    12  // SafeArray populated with Strings.
    13  func TestSafeArrayConversionString(t *testing.T) {
    14  	CoInitialize(0)
    15  	defer CoUninitialize()
    16  
    17  	clsid, err := CLSIDFromProgID("QBXMLRP2.RequestProcessor.1")
    18  	if err != nil {
    19  		if err.(*OleError).Code() == CO_E_CLASSSTRING {
    20  			return
    21  		}
    22  		t.Log(err)
    23  		t.FailNow()
    24  	}
    25  
    26  	unknown, err := CreateInstance(clsid, IID_IUnknown)
    27  	if err != nil {
    28  		t.Log(err)
    29  		t.FailNow()
    30  	}
    31  	defer unknown.Release()
    32  
    33  	dispatch, err := unknown.QueryInterface(IID_IDispatch)
    34  	if err != nil {
    35  		t.Log(err)
    36  		t.FailNow()
    37  	}
    38  
    39  	var dispid []int32
    40  	dispid, err = dispatch.GetIDsOfName([]string{"OpenConnection2"})
    41  	if err != nil {
    42  		t.Log(err)
    43  		t.FailNow()
    44  	}
    45  
    46  	var result *VARIANT
    47  	_, err = dispatch.Invoke(dispid[0], DISPATCH_METHOD, "", "Test Application 1", 1)
    48  	if err != nil {
    49  		t.Log(err)
    50  		t.FailNow()
    51  	}
    52  
    53  	dispid, err = dispatch.GetIDsOfName([]string{"BeginSession"})
    54  	if err != nil {
    55  		t.Log(err)
    56  		t.FailNow()
    57  	}
    58  
    59  	result, err = dispatch.Invoke(dispid[0], DISPATCH_METHOD, "", 2)
    60  	if err != nil {
    61  		t.Log(err)
    62  		t.FailNow()
    63  	}
    64  
    65  	ticket := result.ToString()
    66  
    67  	dispid, err = dispatch.GetIDsOfName([]string{"QBXMLVersionsForSession"})
    68  	if err != nil {
    69  		t.Log(err)
    70  		t.FailNow()
    71  	}
    72  
    73  	result, err = dispatch.Invoke(dispid[0], DISPATCH_PROPERTYGET, ticket)
    74  	if err != nil {
    75  		t.Log(err)
    76  		t.FailNow()
    77  	}
    78  
    79  	// Where the real tests begin.
    80  	conversion := result.ToArray()
    81  
    82  	totalElements, _ := conversion.TotalElements(0)
    83  	if totalElements != 13 {
    84  		t.Log(fmt.Sprintf("%d total elements does not equal 13\n", totalElements))
    85  		t.Fail()
    86  	}
    87  
    88  	versions := conversion.ToStringArray()
    89  	if len(versions) != 13 {
    90  		t.Log(fmt.Sprintf("%s\n", strings.Join(versions, ", ")))
    91  		t.Fail()
    92  	}
    93  
    94  	conversion.Release()
    95  
    96  	dispid, err = dispatch.GetIDsOfName([]string{"EndSession"})
    97  	if err != nil {
    98  		t.Log(err)
    99  		t.FailNow()
   100  	}
   101  
   102  	_, err = dispatch.Invoke(dispid[0], DISPATCH_METHOD, ticket)
   103  	if err != nil {
   104  		t.Log(err)
   105  		t.FailNow()
   106  	}
   107  
   108  	dispid, err = dispatch.GetIDsOfName([]string{"CloseConnection"})
   109  	if err != nil {
   110  		t.Log(err)
   111  		t.FailNow()
   112  	}
   113  
   114  	_, err = dispatch.Invoke(dispid[0], DISPATCH_METHOD)
   115  	if err != nil {
   116  		t.Log(err)
   117  		t.FailNow()
   118  	}
   119  }