aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.UnitTesting/DAL_TST.cs
blob: 0ea7b59efbd9dba25b26f426b448459fe4893b8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Tango.DAL;
using System.Linq;
using Tango.Settings;
using Tango.Core;
using Tango.BL;

namespace Tango.UnitTesting
{
    [TestClass]
    [TestCategory("DAL")]
    public class DAL_TST
    {
        [TestMethod]
        public void Validate_Server_SQLServer_Connection()
        {
            String guid = Guid.NewGuid().ToString();

            using (var db = new DAL.Remote.DB.RemoteDB(SettingsManager.Default.GetOrCreate<CoreSettings>().DataSource))
            {
                var action = new DAL.Remote.DB.ACTION_TYPES();
                action.CODE = 1;
                action.NAME = "Action 1";
                action.DESCRIPTION = "Description 1";
                action.GUID = guid;
                action.LAST_UPDATED = DateTime.UtcNow;

                db.ACTION_TYPES.Add(action);
                db.SaveChanges();
            }

            using (var db = new DAL.Remote.DB.RemoteDB(SettingsManager.Default.GetOrCreate<CoreSettings>().DataSource))
            {
                var action = db.ACTION_TYPES.Single(x => x.GUID == guid);
                db.ACTION_TYPES.Remove(action);
                db.SaveChanges();
            }
        }

        [TestMethod]
        public void Validate_Local_SQLite_Connection()
        {
            String guid = Guid.NewGuid().ToString();

            using (var db = new DAL.Local.DB.LocalDB(Helper.GetSQLiteFilePath()))
            {
                var action = new DAL.Local.DB.ACTION_TYPES();
                action.CODE = 1;
                action.NAME = "Action 1";
                action.DESCRIPTION = "Description 1";
                action.GUID = guid;

                db.ACTION_TYPES.Add(action);
                db.SaveChanges();
            }

            using (var db = new DAL.Local.DB.LocalDB(Helper.GetSQLiteFilePath()))
            {
                var actions = db.ACTION_TYPES.ToList();
                var action = db.ACTION_TYPES.Single(x => x.GUID == guid);
                db.ACTION_TYPES.Remove(action);
                db.SaveChanges();
            }
        }

        [TestMethod]
        public void Validate_SQLite_Connection_Using_Observables()
        {
            using (ObservablesContext db = ObservablesContext.CreateDefault(@"D:\Development\Tango\Software\DB\Tango.db", DataSourceType.SQLite))
            {
                var actions = db.ActionTypes.ToList();
            }
        }
    }
}
span class="p">(false); pVideoSampleGrabber.SetOneShot(false); pVideoSampleGrabber.SetCallback(sampleGrabberImpl, 0); DirectShowLib.DsUtils.FreeAMMediaType(mtVideo); } public static IBaseFilter GetVideoInputDeviceFilter(Device device) { return GetFilterByNameAndCat(device); } /// <summary> /// Create IBaseFilter from the specified category by the specified name. /// </summary> /// <param name="category"></param> /// <param name="filterName"></param> /// <returns></returns> public static IBaseFilter GetFilterByNameAndCat(Device device) { object source = null; var iid = (typeof(IBaseFilter)).GUID; var devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); foreach (DsDevice d in devices) { if (d.DevicePath == device.DevicePath) { d.Mon.BindToObject(null, null, ref iid, out source); break; } } return (IBaseFilter)source; } public static List<Device> GetVideoInputDevices() { var devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); return devices.Select(device => new Device() { DevicePath = device.DevicePath, Name = device.Name }).ToList(); } /// <summary> /// Connect 2 filters. This is a special implementation of connect filters. It will loop through /// all of the unconnected output pins of the source filter and all of the unconnected input pins of the destination filter /// and it will try any connection, between any of the 2 pairs of pins. On the first succesfull connection /// it will return. /// </summary> /// <param name="graph">IGraphBuilder where source and destination filter are added.</param> /// <param name="pSrc">Source filter.</param> /// <param name="pDst">Destination filter.</param> /// <returns>true if the connection is succesfull, otherwise false.</returns> [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] public static bool ConnectFiltersTryAllPins(IGraphBuilder graph, IBaseFilter pSrc, IBaseFilter pDst) { int srcPins = CountPins(pSrc, PinDirection.Output); int dstPins = CountPins(pDst, PinDirection.Input); bool connection = false; for (int i = 0; i < srcPins; i++) { IPin pSrcPin = GetPinAtIndex(pSrc, PinDirection.Output, i, false); if (pSrcPin == null) continue; for (int j = 0; j < dstPins; j++) { IPin pDstPin = GetPinAtIndex(pDst, PinDirection.Input, j, false); if (pDstPin == null) continue; int hr = graph.Connect(pSrcPin, pDstPin); connection = (hr == 0) || (hr == 262722); // S_OK or VFW_S_PARTIAL_RENDER= 0x00040242 (262722) Marshal.ReleaseComObject(pDstPin); if (connection) break; } Marshal.ReleaseComObject(pSrcPin); if (connection) break; } return connection; } /// <summary> /// Count all of the pins on a filter with a specified direction. /// </summary> /// <param name="pFilter">Filter to count pins for.</param> /// <param name="pinDir">Pin direction required to count pins for.</param> /// <returns></returns> [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] public static int CountPins(IBaseFilter pFilter, PinDirection pinDir) { IEnumPins enumPins; var pins = new IPin[1]; int hr = pFilter.EnumPins(out enumPins); if (hr != 0) return 0; var nrPins = 0; try { while (enumPins.Next(pins.Length, pins, IntPtr.Zero) == 0) { try { PinInfo pinInfo; hr = pins[0].QueryPinInfo(out pinInfo); if (pinInfo.dir == pinDir) { nrPins++; } if (pinInfo.filter != null) Marshal.ReleaseComObject(pinInfo.filter); } finally { Marshal.ReleaseComObject(pins[0]); } } } finally { if (enumPins != null) Marshal.ReleaseComObject(enumPins); } return nrPins; } /// <summary> /// Get pin at a specified index on a filter. /// </summary> /// <param name="pFilter">IBaseFilter to find pin on.</param> /// <param name="pinDir">Pin direction.</param> /// <param name="index">Zero based index of the pin. Indexes are counted depending on the pin direction.</param> /// <param name="connected">Should the pin be connected or not.</param> /// <returns></returns> [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] public static IPin GetPinAtIndex(IBaseFilter pFilter, PinDirection pinDir, int index, bool connected) { IEnumPins enumPins; var pins = new IPin[1]; int hr = pFilter.EnumPins(out enumPins); if (hr != 0) return null; var nrPins = -1; bool found = false; try { while (enumPins.Next(pins.Length, pins, IntPtr.Zero) == 0) { try { PinInfo pinInfo; hr = pins[0].QueryPinInfo(out pinInfo); if (pinInfo.dir == pinDir) { nrPins++; } if (pinInfo.filter != null) Marshal.ReleaseComObject(pinInfo.filter); // Check if a pin is connected IPin pConPin = null; pins[0].ConnectedTo(out pConPin); if (pConPin != null && !connected) { Marshal.ReleaseComObject(pConPin); continue; } else if (pConPin == null && connected) continue; if (nrPins == index) { found = true; break; } } finally { if (!found) Marshal.ReleaseComObject(pins[0]); } } } finally { if (enumPins != null) Marshal.ReleaseComObject(enumPins); } return pins[0]; } /// <summary> /// Searches for the next connected filter. If the start filter is connected to some downstream /// filter it will return that filter, otherwise, null. /// </summary> /// <param name="pGraph"></param> /// <param name="pStartFilter"></param> /// <returns></returns> [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] public static IBaseFilter GetNextConnectedFilter(IGraphBuilder pGraph, IBaseFilter pStartFilter) { int pinCount = CountPins(pStartFilter, PinDirection.Output); IBaseFilter pReturnFilter = null; for (int i = 0; i < pinCount; i++) { IPin pOutPin = GetPinAtIndex(pStartFilter, PinDirection.Output, i, true); if (pOutPin != null) { IPin pConnectedToPin = null; pOutPin.ConnectedTo(out pConnectedToPin); if (pConnectedToPin != null) { PinInfo pinInfo; pConnectedToPin.QueryPinInfo(out pinInfo); pReturnFilter = pinInfo.filter; Marshal.ReleaseComObject(pConnectedToPin); } Marshal.ReleaseComObject(pOutPin); } if (pReturnFilter != null) break; } return pReturnFilter; } /// <summary> /// Save a DirectShow Graph to a GRF file /// </summary> /// <param name="graphBuilder">the IGraphBuilder interface of the graph</param> /// <param name="fileName">the file to be saved</param> /// <exception cref="System.ArgumentNullException">Thrown if graphBuilder is null</exception> /// <exception cref="System.Runtime.InteropServices.COMException">Thrown if errors occur during the file creation</exception> /// <seealso cref="LoadGraphFile"/> /// <remarks>This method overwrites any existing file</remarks> [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] public static void SaveGraphFile(IGraphBuilder graphBuilder, string fileName) { int hr = 0; IStorage storage = null; #if USING_NET11 UCOMIStream stream = null; #else IStream stream = null; #endif if (graphBuilder == null) throw new ArgumentNullException("graphBuilder"); try { hr = NativeMethods.StgCreateDocfile( fileName, STGM.Create | STGM.Transacted | STGM.ReadWrite | STGM.ShareExclusive, 0, out storage ); Marshal.ThrowExceptionForHR(hr); hr = storage.CreateStream( @"ActiveMovieGraph", STGM.Write | STGM.Create | STGM.ShareExclusive, 0, 0, out stream ); Marshal.ThrowExceptionForHR(hr); hr = (graphBuilder as IPersistStream).Save(stream, true); Marshal.ThrowExceptionForHR(hr); hr = storage.Commit(STGC.Default); Marshal.ThrowExceptionForHR(hr); } finally { if (stream != null) Marshal.ReleaseComObject(stream); if (storage != null) Marshal.ReleaseComObject(storage); } } } }